--============================================================
-- Sha4kHub
-- FULL COMBINED SCRIPT
--============================================================
--
-- TABS
-- Auto
-- ESP
-- Tag
-- Movement
-- Settings
--
-- INCLUDED
-- • Auto Vault
-- • Hard 1-second Auto Vault cooldown
-- • Vault re-arm system
-- • Auto Pallet Stun
-- • Ready/dropped pallet detection
-- • Dropped-pallet-only Auto Vault
-- • Auto Break
-- • Player ESP
-- • Chaser / Runner / Eliminated ESP colors
-- • Object ESP
-- • Pallet / SmallPallet
-- • Window / SmallWindow
-- • Vault1 / Vault2
-- • Custom RGB colors
-- • Custom ESP distance
-- • Player names / roles / health
-- • Auto Tag
-- • Tag Nearest Runner
-- • Runner target cycling
-- • Saved return position
-- • WalkSpeed
-- • Changeable GUI toggle key
-- • Hover sound
-- • Click sound
-- • Draggable GUI
-- • Floating GUI button
-- • UI scale
-- • Notifications
--
-- ROLE SYSTEM
-- StringValue named "Team"
--
-- Chaser = Tagger
-- Runner = Runner
-- Anything else = Eliminated
--
-- PALLET SYSTEM
--
-- A BasePart named exactly "Pallet" is checked.
--
-- READY:
-- Orientation ~= (-87.00299835205078, 0, 180)
-- actually uses a tiny tolerance around the values.
--
-- DROPPED:
-- Any orientation outside the ready orientation.
--
-- Auto Pallet Stun:
-- Runner + Chaser within 4 studs of pallet
-- + pallet still ready
-- = attempt pallet drop.
--
-- Auto Vault:
-- Vault1 / Vault2 can be vaulted normally.
-- Pallet can ONLY be vaulted if it is dropped.
--
--============================================================
--============================================================
-- SERVICES
--============================================================
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local SoundService = game:GetService("SoundService")
local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
--============================================================
-- VIRTUAL INPUT
--============================================================
local VirtualInputManager
pcall(function()
VirtualInputManager = game:GetService(
"VirtualInputManager"
)
end)
--============================================================
-- REMOVE OLD HUB
--============================================================
pcall(function()
local old = PlayerGui:FindFirstChild(
"Sha4kHub"
)
if old then
old:Destroy()
end
end)
--============================================================
-- CONFIG
--============================================================
local Config = {
--========================================================
-- GUI
--========================================================
ToggleKey = Enum.KeyCode.RightShift,
UIAnimations = true,
UIScale = 1,
--========================================================
-- SOUNDS
--========================================================
SoundsEnabled = true,
HoverSounds = true,
ClickSounds = true,
SoundVolume = 0.4,
HoverSoundId =
"rbxassetid://5852470908",
ClickSoundId =
"rbxassetid://140207837688369",
--========================================================
-- AUTO
--========================================================
AutoVault = false,
VaultDistance = 6,
-- Hard minimum is 1 second.
AutoVaultCooldown = 1,
AutoBreak = false,
BreakDistance = 6,
AutoBreakCooldown = 0.25,
--========================================================
-- AUTO PALLET STUN
--========================================================
AutoPalletStun = false,
PalletStunDistance = 4,
PalletDropCooldown = 0.75,
--========================================================
-- MOVEMENT
--========================================================
WalkSpeedEnabled = false,
WalkSpeed = 16,
--========================================================
-- PLAYER ESP
--========================================================
PlayerESP = true,
PlayerESPDistance = 500,
ShowPlayerNames = true,
ShowPlayerRoles = true,
ShowPlayerHealth = true,
ChaserColor =
Color3.fromRGB(
255,
80,
80
),
RunnerColor =
Color3.fromRGB(
80,
170,
255
),
EliminatedColor =
Color3.fromRGB(
135,
135,
135
),
--========================================================
-- OBJECT ESP
--========================================================
ObjectESP = true,
ShowObjectNames = true,
ObjectFillTransparency = 0.65,
ObjectOutlineTransparency = 0,
--========================================================
-- TAGGING
--========================================================
AutoTag = false,
TagDistance = 100,
TagInterval = 0.25,
ReturnAfterTag = true,
--========================================================
-- QOL
--========================================================
NotifyRoleChanges = true,
NotifyAutomation = true,
}
--============================================================
-- OBJECT SETTINGS
--============================================================
local ObjectSettings = {
Pallet = {
Enabled = true,
Color =
Color3.fromRGB(
255,
180,
60
),
Distance = 150,
},
SmallPallet = {
Enabled = true,
Color =
Color3.fromRGB(
255,
120,
40
),
Distance = 150,
},
Window = {
Enabled = true,
Color =
Color3.fromRGB(
80,
200,
255
),
Distance = 150,
},
SmallWindow = {
Enabled = true,
Color =
Color3.fromRGB(
80,
255,
180
),
Distance = 150,
},
Vault1 = {
Enabled = true,
Color =
Color3.fromRGB(
161,
157,
184
),
Distance = 100,
},
Vault2 = {
Enabled = true,
Color =
Color3.fromRGB(
210,
160,
255
),
Distance = 100,
},
}
--============================================================
-- CUSTOM ESP
--============================================================
local CustomObjects = {}
--============================================================
-- CHARACTER
--============================================================
local Character
local Humanoid
local RootPart
local function RefreshCharacter()
Character =
LocalPlayer.Character
or LocalPlayer.CharacterAdded:Wait()
Humanoid =
Character:WaitForChild(
"Humanoid"
)
RootPart =
Character:WaitForChild(
"HumanoidRootPart"
)
end
RefreshCharacter()
LocalPlayer.CharacterAdded:Connect(
function()
task.wait(0.4)
RefreshCharacter()
end
)
--============================================================
-- ROLE SYSTEM
--============================================================
local function GetRole(player)
player =
player or LocalPlayer
local teamValue =
player:FindFirstChild(
"Team"
)
if teamValue
and teamValue:IsA(
"StringValue"
) then
if teamValue.Value ==
"Chaser" then
return "Chaser"
end
if teamValue.Value ==
"Runner" then
return "Runner"
end
return "Eliminated"
end
return "Eliminated"
end
local function IsChaser()
return GetRole() == "Chaser"
end
local function IsRunner()
return GetRole() == "Runner"
end
--============================================================
-- SOUNDS
--============================================================
local HoverSound =
Instance.new(
"Sound"
)
HoverSound.Name =
"Sha4kHubHover"
HoverSound.SoundId =
Config.HoverSoundId
HoverSound.Volume =
Config.SoundVolume
HoverSound.Parent =
SoundService
local ClickSound =
Instance.new(
"Sound"
)
ClickSound.Name =
"Sha4kHubClick"
ClickSound.SoundId =
Config.ClickSoundId
ClickSound.Volume =
Config.SoundVolume
ClickSound.Parent =
SoundService
local function PlayHover()
if not Config.SoundsEnabled then
return
end
if not Config.HoverSounds then
return
end
HoverSound.Volume =
Config.SoundVolume
HoverSound:Stop()
HoverSound:Play()
end
local function PlayClick()
if not Config.SoundsEnabled then
return
end
if not Config.ClickSounds then
return
end
ClickSound.Volume =
Config.SoundVolume
ClickSound:Stop()
ClickSound:Play()
end
--============================================================
-- SPACE INPUT
--============================================================
local function PressSpace()
if VirtualInputManager then
local success =
pcall(function()
VirtualInputManager:SendKeyEvent(
true,
Enum.KeyCode.Space,
false,
game
)
task.wait(0.025)
VirtualInputManager:SendKeyEvent(
false,
Enum.KeyCode.Space,
false,
game
)
end)
if success then
return
end
end
if Humanoid then
Humanoid.Jump = true
end
end
--============================================================
-- GENERAL POSITION HELPERS
--============================================================
local function GetPosition(object)
if not object then
return nil
end
if object:IsA(
"BasePart"
) then
return object.Position
end
if object:IsA(
"Model"
) then
if object.PrimaryPart then
return object.PrimaryPart.Position
end
local part =
object:FindFirstChildWhichIsA(
"BasePart",
true
)
if part then
return part.Position
end
end
return nil
end
local function GetDistance(object)
if not RootPart then
return math.huge
end
local position =
GetPosition(
object
)
if not position then
return math.huge
end
return (
RootPart.Position -
position
).Magnitude
end
--============================================================
-- PALLET ORIENTATION SYSTEM
--============================================================
local READY_PALLET_X =
-87.00299835205078
local READY_PALLET_Y =
0
local READY_PALLET_Z =
180
-- Tiny allowance for floating point / physics changes.
local PALLET_ANGLE_TOLERANCE =
0.15
local function IsPalletReady(
pallet
)
if not pallet then
return false
end
if not pallet:IsA(
"BasePart"
) then
return false
end
local orientation =
pallet.Orientation
local xReady =
math.abs(
orientation.X -
READY_PALLET_X
)
<= PALLET_ANGLE_TOLERANCE
local yReady =
math.abs(
orientation.Y -
READY_PALLET_Y
)
<= PALLET_ANGLE_TOLERANCE
local zReady =
math.abs(
orientation.Z -
READY_PALLET_Z
)
<= PALLET_ANGLE_TOLERANCE
return
xReady
and yReady
and zReady
end
local function IsPalletDropped(
pallet
)
if not pallet then
return false
end
if not pallet:IsA(
"BasePart"
) then
return false
end
return not IsPalletReady(
pallet
)
end
--============================================================
-- FIND CHASER NEAR POSITION
--============================================================
local function FindNearbyChaser(
position,
maxDistance
)
local nearest
local nearestDistance =
maxDistance
for _, player in ipairs(
Players:GetPlayers()
) do
if player ~= LocalPlayer
and GetRole(player) ==
"Chaser" then
local character =
player.Character
if character then
local root =
character:FindFirstChild(
"HumanoidRootPart"
)
if root then
local distance =
(
root.Position -
position
).Magnitude
if distance <=
nearestDistance then
nearest =
player
nearestDistance =
distance
end
end
end
end
end
return nearest,
nearestDistance
end
--============================================================
-- FIND READY PALLET WITH CHASER CLOSE
--============================================================
local function FindNearbyReadyPallet()
local nearestPallet
local nearestChaser
local nearestDistance =
Config.PalletStunDistance
for _, object in ipairs(
workspace:GetDescendants()
) do
-- Part / MeshPart / UnionOperation etc.
-- all inherit BasePart.
if object:IsA(
"BasePart"
)
and object.Name ==
"Pallet" then
if IsPalletReady(
object
) then
local chaser,
chaserDistance =
FindNearbyChaser(
object.Position,
Config.PalletStunDistance
)
if chaser
and chaserDistance <=
nearestDistance then
nearestPallet =
object
nearestChaser =
chaser
nearestDistance =
chaserDistance
end
end
end
end
return nearestPallet,
nearestChaser,
nearestDistance
end
--============================================================
-- PALLET DROP
--============================================================
local LastPalletDropTimes = {}
local function AttemptDropPallet(
pallet
)
if not pallet then
return false
end
if not pallet.Parent then
return false
end
-- Never attempt to drop an already
-- dropped pallet.
if not IsPalletReady(
pallet
) then
return false
end
local now =
os.clock()
local lastTime =
LastPalletDropTimes[pallet]
or 0
if now - lastTime <
Config.PalletDropCooldown then
return false
end
LastPalletDropTimes[pallet] =
now
--========================================================
-- PROXIMITY PROMPT
--========================================================
local prompt =
pallet:FindFirstChildWhichIsA(
"ProximityPrompt",
true
)
if prompt then
local used =
false
-- Some supported environments expose
-- fireproximityprompt to LocalScripts.
pcall(function()
if fireproximityprompt then
fireproximityprompt(
prompt
)
used =
true
end
end)
if used then
return true
end
end
--========================================================
-- CLICK DETECTOR
--========================================================
local clickDetector =
pallet:FindFirstChildWhichIsA(
"ClickDetector",
true
)
if clickDetector then
local used =
false
pcall(function()
if fireclickdetector then
fireclickdetector(
clickDetector
)
used =
true
end
end)
if used then
return true
end
end
return false
end
--============================================================
-- AUTO PALLET STUN
--============================================================
local function TryAutoPalletStun()
if not Config.AutoPalletStun then
return
end
-- The local player should be the Runner
-- who is dropping the pallet.
if not IsRunner() then
return
end
local pallet,
chaser =
FindNearbyReadyPallet()
if not pallet
or not chaser then
return
end
-- One final check before interacting.
if not IsPalletReady(
pallet
) then
return
end
local dropped =
AttemptDropPallet(
pallet
)
if dropped then
-- Allow physics/game logic a moment
-- to change the orientation.
task.delay(
0.1,
function()
if pallet
and pallet.Parent
and IsPalletDropped(
pallet
) then
if Config.NotifyAutomation then
Notify(
"Pallet dropped!"
)
end
end
end
)
end
end
--============================================================
-- ESP STORAGE
--============================================================
local ESPWorldFolder =
Instance.new(
"Folder"
)
ESPWorldFolder.Name =
"Sha4kHubESP"
ESPWorldFolder.Parent =
workspace
local ESPBillboardFolder =
Instance.new(
"Folder"
)
ESPBillboardFolder.Name =
"Sha4kHubESP"
ESPBillboardFolder.Parent =
PlayerGui
local ObjectESPObjects = {}
local PlayerESPObjects = {}
--============================================================
-- REMOVE OBJECT ESP
--============================================================
local function RemoveObjectESP(
object
)
local data =
ObjectESPObjects[
object
]
if not data then
return
end
if data.Highlight then
data.Highlight:Destroy()
end
if data.Billboard then
data.Billboard:Destroy()
end
ObjectESPObjects[
object
] = nil
end
--============================================================
-- CREATE OBJECT ESP
--============================================================
local function CreateObjectESP(
object,
settings
)
if not object
or not object:IsDescendantOf(
workspace
) then
return
end
if ObjectESPObjects[
object
] then
return
end
local highlight =
Instance.new(
"Highlight"
)
highlight.Name =
"Sha4kObjectESP"
highlight.Adornee =
object
highlight.FillColor =
settings.Color
highlight.OutlineColor =
settings.Color
highlight.FillTransparency =
Config.ObjectFillTransparency
highlight.OutlineTransparency =
Config.ObjectOutlineTransparency
highlight.DepthMode =
Enum.HighlightDepthMode.AlwaysOnTop
highlight.Parent =
ESPWorldFolder
local billboard
if Config.ShowObjectNames then
local part
if object:IsA(
"BasePart"
) then
part =
object
elseif object:IsA(
"Model"
) then
part =
object.PrimaryPart
or object:FindFirstChildWhichIsA(
"BasePart",
true
)
end
if part then
billboard =
Instance.new(
"BillboardGui"
)
billboard.Name =
"Sha4kObjectName"
billboard.Adornee =
part
billboard.Size =
UDim2.fromOffset(
170,
26
)
billboard.StudsOffset =
Vector3.new(
0,
2.5,
0
)
billboard.AlwaysOnTop =
true
billboard.Parent =
ESPBillboardFolder
local label =
Instance.new(
"TextLabel"
)
label.Size =
UDim2.fromScale(
1,
1
)
label.BackgroundTransparency =
1
label.Font =
Enum.Font.GothamBold
label.TextSize =
12
label.TextColor3 =
settings.Color
label.TextStrokeTransparency =
0.35
label.Text =
object.Name
label.Parent =
billboard
end
end
ObjectESPObjects[
object
] = {
Highlight =
highlight,
Billboard =
billboard,
}
end
--============================================================
-- UPDATE OBJECT ESP
--============================================================
local function UpdateObjectESP(
object
)
if not object
or not object:IsDescendantOf(
workspace
) then
RemoveObjectESP(
object
)
return
end
local settings =
ObjectSettings[
object.Name
]
or
CustomObjects[
object.Name
]
if not Config.ObjectESP
or not settings
or not settings.Enabled then
RemoveObjectESP(
object
)
return
end
local distance =
GetDistance(
object
)
if distance >
settings.Distance then
local data =
ObjectESPObjects[
object
]
if data then
data.Highlight.Enabled =
false
if data.Billboard then
data.Billboard.Enabled =
false
end
end
return
end
if not ObjectESPObjects[
object
] then
CreateObjectESP(
object,
settings
)
end
local data =
ObjectESPObjects[
object
]
if not data then
return
end
data.Highlight.Enabled =
true
data.Highlight.FillColor =
settings.Color
data.Highlight.OutlineColor =
settings.Color
data.Highlight.FillTransparency =
Config.ObjectFillTransparency
data.Highlight.OutlineTransparency =
Config.ObjectOutlineTransparency
if data.Billboard then
data.Billboard.Enabled =
Config.ShowObjectNames
local label =
data.Billboard:FindFirstChildOfClass(
"TextLabel"
)
if label then
label.TextColor3 =
settings.Color
end
end
end
--============================================================
-- PLAYER ESP COLOR
--============================================================
local function GetPlayerColor(
player
)
local role =
GetRole(
player
)
if role ==
"Chaser" then
return Config.ChaserColor
elseif role ==
"Runner" then
return Config.RunnerColor
else
return Config.EliminatedColor
end
end
--============================================================
-- REMOVE PLAYER ESP
--============================================================
local function RemovePlayerESP(
player
)
local data =
PlayerESPObjects[
player
]
if not data then
return
end
if data.Highlight then
data.Highlight:Destroy()
end
if data.Billboard then
data.Billboard:Destroy()
end
PlayerESPObjects[
player
] = nil
end
--============================================================
-- CREATE PLAYER ESP
--============================================================
local function CreatePlayerESP(
player
)
if player ==
LocalPlayer then
return
end
local character =
player.Character
if not character then
return
end
local root =
character:FindFirstChild(
"HumanoidRootPart"
)
if not root then
return
end
RemovePlayerESP(
player
)
local color =
GetPlayerColor(
player
)
local highlight =
Instance.new(
"Highlight"
)
highlight.Name =
"Sha4kPlayerESP"
highlight.Adornee =
character
highlight.FillColor =
color
highlight.OutlineColor =
color
highlight.FillTransparency =
Config.ObjectFillTransparency
highlight.OutlineTransparency =
Config.ObjectOutlineTransparency
highlight.DepthMode =
Enum.HighlightDepthMode.AlwaysOnTop
highlight.Parent =
ESPWorldFolder
local billboard =
Instance.new(
"BillboardGui"
)
billboard.Name =
"Sha4kPlayerInfo"
billboard.Adornee =
root
billboard.Size =
UDim2.fromOffset(
190,
65
)
billboard.StudsOffset =
Vector3.new(
0,
3.5,
0
)
billboard.AlwaysOnTop =
true
billboard.Parent =
ESPBillboardFolder
local label =
Instance.new(
"TextLabel"
)
label.Size =
UDim2.fromScale(
1,
1
)
label.BackgroundTransparency =
1
label.Font =
Enum.Font.GothamBold
label.TextSize =
12
label.TextColor3 =
color
label.TextStrokeTransparency =
0.35
label.TextWrapped =
true
label.Parent =
billboard
PlayerESPObjects[
player
] = {
Highlight =
highlight,
Billboard =
billboard,
Label =
label,
}
end
--============================================================
-- UPDATE PLAYER ESP
--============================================================
local function UpdatePlayerESP(
player
)
if player ==
LocalPlayer then
return
end
if not Config.PlayerESP then
RemovePlayerESP(
player
)
return
end
local character =
player.Character
if not character then
RemovePlayerESP(
player
)
return
end
local root =
character:FindFirstChild(
"HumanoidRootPart"
)
if not root then
RemovePlayerESP(
player
)
return
end
local distance =
GetDistance(
character
)
if distance >
Config.PlayerESPDistance then
local data =
PlayerESPObjects[
player
]
if data then
data.Highlight.Enabled =
false
data.Billboard.Enabled =
false
end
return
end
if not PlayerESPObjects[
player
] then
CreatePlayerESP(
player
)
end
local data =
PlayerESPObjects[
player
]
if not data then
return
end
local role =
GetRole(
player
)
local color =
GetPlayerColor(
player
)
data.Highlight.Enabled =
true
data.Billboard.Enabled =
true
data.Highlight.FillColor =
color
data.Highlight.OutlineColor =
color
data.Highlight.FillTransparency =
Config.ObjectFillTransparency
data.Highlight.OutlineTransparency =
Config.ObjectOutlineTransparency
local lines = {}
if Config.ShowPlayerNames then
table.insert(
lines,
player.DisplayName
)
end
if Config.ShowPlayerRoles then
table.insert(
lines,
"[" ..
role ..
"]"
)
end
if Config.ShowPlayerHealth then
local humanoid =
character:FindFirstChildOfClass(
"Humanoid"
)
if humanoid then
table.insert(
lines,
string.format(
"HP: %d/%d",
math.floor(
humanoid.Health
),
math.floor(
humanoid.MaxHealth
)
)
)
end
end
data.Label.Text =
table.concat(
lines,
"\n"
)
data.Label.TextColor3 =
color
end
--============================================================
-- CUSTOM ESP
--============================================================
local function AddCustomESP(
name,
color,
distance
)
if typeof(name) ~=
"string"
or name == "" then
return false
end
CustomObjects[
name
] = {
Enabled =
true,
Color =
color
or Color3.new(
1,
1,
1
),
Distance =
distance
or 150,
}
return true
end
--============================================================
-- FIND NEAREST OBJECT
--============================================================
local function FindNearestObject(
names,
maxDistance
)
local nearest
local nearestDistance =
maxDistance
for _, object in ipairs(
workspace:GetDescendants()
) do
if names[
object.Name
] then
local distance =
GetDistance(
object
)
if distance <=
nearestDistance then
nearest =
object
nearestDistance =
distance
end
end
end
return nearest,
nearestDistance
end
--============================================================
-- AUTOMATION: VAULT
--============================================================
local VaultNames = {
Vault1 = true,
Vault2 = true,
}
local LastVaultTime = 0
local VaultLockedObject = nil
local VaultRearmDistance = 2
local function FindNearestVaultableObject(
maxDistance
)
local nearest
local nearestDistance =
maxDistance
--========================================================
-- VAULT1 / VAULT2
--========================================================
for _, object in ipairs(
workspace:GetDescendants()
) do
if VaultNames[
object.Name
] then
local distance =
GetDistance(
object
)
if distance <=
nearestDistance then
nearest =
object
nearestDistance =
distance
end
end
end
--========================================================
-- DROPPED PALLETS ONLY
--========================================================
for _, object in ipairs(
workspace:GetDescendants()
) do
if object:IsA(
"BasePart"
)
and object.Name ==
"Pallet" then
-- This is the important rule:
-- upright/ready pallets are NEVER
-- considered vaultable.
if IsPalletDropped(
object
) then
local distance =
GetDistance(
object
)
if distance <=
nearestDistance then
nearest =
object
nearestDistance =
distance
end
end
end
end
return nearest
end
local function TryAutoVault()
if not Config.AutoVault then
return
end
if not Character
or not RootPart
or not Humanoid then
return
end
local now =
os.clock()
--========================================================
-- HARD 1-SECOND COOLDOWN
--========================================================
if now -
LastVaultTime <
Config.AutoVaultCooldown then
return
end
--========================================================
-- SAME-OBJECT REARM
--========================================================
--
-- Once a vault is activated, the script will
-- not activate that exact object again until
-- the player has moved away from it.
--
-- This prevents:
-- SPACE -> vault -> SPACE -> vault -> ...
--
--========================================================
if VaultLockedObject then
if not VaultLockedObject:IsDescendantOf(
workspace
) then
VaultLockedObject =
nil
else
local distance =
GetDistance(
VaultLockedObject
)
if distance >
Config.VaultDistance
+ VaultRearmDistance then
VaultLockedObject =
nil
else
return
end
end
end
--========================================================
-- FIND VAULTABLE OBJECT
--========================================================
local vault =
FindNearestVaultableObject(
Config.VaultDistance
)
if not vault then
return
end
-- Extra safety:
-- a pallet must still be dropped
-- immediately before vaulting.
if vault.Name ==
"Pallet"
and not IsPalletDropped(
vault
) then
return
end
LastVaultTime =
now
VaultLockedObject =
vault
PressSpace()
end
--============================================================
-- AUTOMATION: AUTO BREAK
--============================================================
local LastBreakTime = 0
local function TryAutoBreak()
if not Config.AutoBreak then
return
end
if not IsChaser() then
return
end
local now =
os.clock()
if now -
LastBreakTime <
Config.AutoBreakCooldown then
return
end
local pallet =
FindNearestObject(
{
Pallet = true,
SmallPallet = true
},
Config.BreakDistance
)
if not pallet then
return
end
LastBreakTime =
now
PressSpace()
end
--============================================================
-- TAGGING
--============================================================
local TagActive = false
local TagTarget = nil
local OriginalTagPosition = nil
local function SaveTagPosition()
if RootPart then
OriginalTagPosition =
RootPart.CFrame
end
end
local function ReturnToTagPosition()
if Config.ReturnAfterTag
and OriginalTagPosition
and RootPart then
RootPart.CFrame =
OriginalTagPosition
end
OriginalTagPosition =
nil
end
local function StopTagging(
returnPosition
)
TagActive =
false
TagTarget =
nil
if returnPosition then
ReturnToTagPosition()
else
OriginalTagPosition =
nil
end
end
local function FindNearestRunner(
maxDistance
)
if not RootPart then
return nil
end
local nearest
local nearestDistance =
maxDistance
or math.huge
for _, player in ipairs(
Players:GetPlayers()
) do
if player ~= LocalPlayer
and GetRole(player) ==
"Runner" then
local character =
player.Character
if character then
local root =
character:FindFirstChild(
"HumanoidRootPart"
)
if root then
local distance =
(
RootPart.Position -
root.Position
).Magnitude
if distance <
nearestDistance then
nearest =
player
nearestDistance =
distance
end
end
end
end
end
return nearest
end
local function GetRunnerList()
local runners = {}
for _, player in ipairs(
Players:GetPlayers()
) do
if player ~= LocalPlayer
and GetRole(player) ==
"Runner" then
table.insert(
runners,
player
)
end
end
table.sort(
runners,
function(a, b)
return a.Name <
b.Name
end
)
return runners
end
local function TeleportToTarget(
target
)
if not target
or not target.Parent
or not RootPart then
return false
end
local character =
target.Character
if not character then
return false
end
local targetRoot =
character:FindFirstChild(
"HumanoidRootPart"
)
if not targetRoot then
return false
end
RootPart.CFrame =
targetRoot.CFrame *
CFrame.new(
0,
0,
-3
)
return true
end
--============================================================
-- GUI
--============================================================
local ScreenGui =
Instance.new(
"ScreenGui"
)
ScreenGui.Name =
"Sha4kHub"
ScreenGui.ResetOnSpawn =
false
ScreenGui.IgnoreGuiInset =
true
ScreenGui.ZIndexBehavior =
Enum.ZIndexBehavior.Sibling
ScreenGui.Parent =
PlayerGui
local UIScale =
Instance.new(
"UIScale"
)
UIScale.Scale =
Config.UIScale
UIScale.Parent =
ScreenGui
--============================================================
-- NOTIFICATION HOLDER
--============================================================
local NotificationHolder =
Instance.new(
"Frame"
)
NotificationHolder.AnchorPoint =
Vector2.new(
1,
1
)
NotificationHolder.Position =
UDim2.new(
1,
-18,
1,
-18
)
NotificationHolder.Size =
UDim2.fromOffset(
310,
260
)
NotificationHolder.BackgroundTransparency =
1
NotificationHolder.Parent =
ScreenGui
local NotificationLayout =
Instance.new(
"UIListLayout"
)
NotificationLayout.VerticalAlignment =
Enum.VerticalAlignment.Bottom
NotificationLayout.HorizontalAlignment =
Enum.HorizontalAlignment.Right
NotificationLayout.Padding =
UDim.new(
0,
7
)
NotificationLayout.Parent =
NotificationHolder
--============================================================
-- NOTIFY
--============================================================
local function Notify(
text
)
local notification =
Instance.new(
"Frame"
)
notification.Size =
UDim2.fromOffset(
290,
50
)
notification.BackgroundColor3 =
Color3.fromRGB(
23,
23,
30
)
notification.BorderSizePixel =
0
notification.Parent =
NotificationHolder
local corner =
Instance.new(
"UICorner"
)
corner.CornerRadius =
UDim.new(
0,
9
)
corner.Parent =
notification
local stroke =
Instance.new(
"UIStroke"
)
stroke.Color =
Color3.fromRGB(
161,
157,
184
)
stroke.Transparency =
0.45
stroke.Parent =
notification
local label =
Instance.new(
"TextLabel"
)
label.Position =
UDim2.fromOffset(
13,
0
)
label.Size =
UDim2.new(
1,
-26,
1,
0
)
label.BackgroundTransparency =
1
label.Font =
Enum.Font.GothamMedium
label.TextSize =
13
label.TextColor3 =
Color3.fromRGB(
240,
240,
245
)
label.TextXAlignment =
Enum.TextXAlignment.Left
label.Text =
text
label.Parent =
notification
notification.Position =
UDim2.new(
1,
20,
0,
0
)
TweenService:Create(
notification,
TweenInfo.new(
0.25,
Enum.EasingStyle.Quint,
Enum.EasingDirection.Out
),
{
Position =
UDim2.new(
0,
0,
0,
0
)
}
):Play()
task.delay(
2.5,
function()
if not notification.Parent then
return
end
local tween =
TweenService:Create(
notification,
TweenInfo.new(
0.22,
Enum.EasingStyle.Quint,
Enum.EasingDirection.In
),
{
Position =
UDim2.new(
1,
20,
0,
0
)
}
)
tween:Play()
tween.Completed:Once(
function()
if notification then
notification:Destroy()
end
end
)
end
)
end
--============================================================
-- INTRO
--============================================================
local Intro =
Instance.new(
"Frame"
)
Intro.Size =
UDim2.fromScale(
1,
1
)
Intro.BackgroundTransparency =
1
Intro.Parent =
ScreenGui
local IntroText =
Instance.new(
"TextLabel"
)
IntroText.AnchorPoint =
Vector2.new(
0.5,
0.5
)
IntroText.Position =
UDim2.fromScale(
0.5,
0.5
)
IntroText.Size =
UDim2.fromOffset(
500,
100
)
IntroText.BackgroundTransparency =
1
IntroText.RichText =
true
IntroText.Font =
Enum.Font.GothamBold
IntroText.TextSize =
48
IntroText.TextTransparency =
1
IntroText.Text =
'Sha4k' ..
'Hub'
IntroText.Parent =
Intro
TweenService:Create(
IntroText,
TweenInfo.new(
0.45,
Enum.EasingStyle.Quint,
Enum.EasingDirection.Out
),
{
TextTransparency = 0
}
):Play()
task.wait(1.1)
TweenService:Create(
IntroText,
TweenInfo.new(
0.3,
Enum.EasingStyle.Quint,
Enum.EasingDirection.In
),
{
TextTransparency = 1
}
):Play()
task.wait(0.35)
Intro:Destroy()
--============================================================
-- COLORS
--============================================================
local Accent =
Color3.fromRGB(
161,
157,
184
)
local ButtonColor =
Color3.fromRGB(
28,
28,
36
)
local SelectedColor =
Color3.fromRGB(
161,
157,
184
)
local TextColor =
Color3.fromRGB(
238,
238,
242
)
local MutedColor =
Color3.fromRGB(
150,
149,
163
)
--============================================================
-- MAIN FRAME
--============================================================
local Main =
Instance.new(
"Frame"
)
Main.AnchorPoint =
Vector2.new(
0.5,
0.5
)
Main.Position =
UDim2.fromScale(
0.5,
0.5
)
Main.Size =
UDim2.fromOffset(
600,
500
)
Main.BackgroundColor3 =
Color3.fromRGB(
18,
18,
24
)
Main.BorderSizePixel =
0
Main.ClipsDescendants =
true
Main.Parent =
ScreenGui
local MainCorner =
Instance.new(
"UICorner"
)
MainCorner.CornerRadius =
UDim.new(
0,
14
)
MainCorner.Parent =
Main
local MainStroke =
Instance.new(
"UIStroke"
)
MainStroke.Color =
Color3.fromRGB(
65,
63,
78
)
MainStroke.Transparency =
0.25
MainStroke.Parent =
Main
--============================================================
-- TOPBAR
--============================================================
local Topbar =
Instance.new(
"Frame"
)
Topbar.Size =
UDim2.new(
1,
0,
0,
58
)
Topbar.BackgroundColor3 =
Color3.fromRGB(
23,
23,
30
)
Topbar.BorderSizePixel =
0
Topbar.Parent =
Main
local Title =
Instance.new(
"TextLabel"
)
Title.Position =
UDim2.fromOffset(
18,
0
)
Title.Size =
UDim2.fromOffset(
250,
58
)
Title.BackgroundTransparency =
1
Title.RichText =
true
Title.Font =
Enum.Font.GothamBold
Title.TextSize =
21
Title.TextXAlignment =
Enum.TextXAlignment.Left
Title.Text =
'Sha4k' ..
'Hub'
Title.Parent =
Topbar
local RoleLabel =
Instance.new(
"TextLabel"
)
RoleLabel.AnchorPoint =
Vector2.new(
1,
0.5
)
RoleLabel.Position =
UDim2.new(
1,
-17,
0.5,
0
)
RoleLabel.Size =
UDim2.fromOffset(
200,
25
)
RoleLabel.BackgroundTransparency =
1
RoleLabel.Font =
Enum.Font.GothamMedium
RoleLabel.TextSize =
12
RoleLabel.TextColor3 =
Color3.fromRGB(
170,
168,
184
)
RoleLabel.TextXAlignment =
Enum.TextXAlignment.Right
RoleLabel.Text =
"Role: " ..
GetRole()
RoleLabel.Parent =
Topbar
--============================================================
-- DRAGGING
--============================================================
local Dragging = false
local DragStart
local StartPosition
Topbar.InputBegan:Connect(
function(input)
if input.UserInputType ==
Enum.UserInputType.MouseButton1
or
input.UserInputType ==
Enum.UserInputType.Touch then
Dragging =
true
DragStart =
input.Position
StartPosition =
Main.Position
end
end
)
UserInputService.InputChanged:Connect(
function(input)
if not Dragging then
return
end
if input.UserInputType ~=
Enum.UserInputType.MouseMovement
and
input.UserInputType ~=
Enum.UserInputType.Touch then
return
end
local delta =
input.Position -
DragStart
Main.Position =
UDim2.new(
StartPosition.X.Scale,
StartPosition.X.Offset +
delta.X,
StartPosition.Y.Scale,
StartPosition.Y.Offset +
delta.Y
)
end
)
UserInputService.InputEnded:Connect(
function(input)
if input.UserInputType ==
Enum.UserInputType.MouseButton1
or
input.UserInputType ==
Enum.UserInputType.Touch then
Dragging =
false
end
end
)
--============================================================
-- NAVIGATION
--============================================================
local Navigation =
Instance.new(
"Frame"
)
Navigation.Position =
UDim2.fromOffset(
10,
68
)
Navigation.Size =
UDim2.new(
0,
105,
1,
-78
)
Navigation.BackgroundTransparency =
1
Navigation.Parent =
Main
local NavigationLayout =
Instance.new(
"UIListLayout"
)
NavigationLayout.Padding =
UDim.new(
0,
7
)
NavigationLayout.SortOrder =
Enum.SortOrder.LayoutOrder
NavigationLayout.Parent =
Navigation
local Content =
Instance.new(
"Frame"
)
Content.Position =
UDim2.fromOffset(
125,
68
)
Content.Size =
UDim2.new(
1,
-135,
1,
-78
)
Content.BackgroundTransparency =
1
Content.Parent =
Main
--============================================================
-- TAB SYSTEM
--============================================================
local Tabs = {}
local CurrentTab
local function SwitchTab(
name
)
for tabName, tab in pairs(
Tabs
) do
local selected =
tabName == name
tab.Page.Visible =
selected
if selected then
TweenService:Create(
tab.Button,
TweenInfo.new(
0.15,
Enum.EasingStyle.Quint,
Enum.EasingDirection.Out
),
{
BackgroundColor3 =
SelectedColor
}
):Play()
tab.Label.TextColor3 =
Color3.fromRGB(
22,
22,
28
)
tab.Icon.ImageColor3 =
Color3.fromRGB(
22,
22,
28
)
else
TweenService:Create(
tab.Button,
TweenInfo.new(
0.15,
Enum.EasingStyle.Quint,
Enum.EasingDirection.Out
),
{
BackgroundColor3 =
ButtonColor
}
):Play()
tab.Label.TextColor3 =
TextColor
tab.Icon.ImageColor3 =
TextColor
end
end
CurrentTab =
name
end
local function CreateTab(
name,
iconId
)
local page =
Instance.new(
"ScrollingFrame"
)
page.Name =
name
page.Size =
UDim2.fromScale(
1,
1
)
page.BackgroundTransparency =
1
page.BorderSizePixel =
0
page.ScrollBarThickness =
3
page.ScrollBarImageColor3 =
Accent
page.AutomaticCanvasSize =
Enum.AutomaticSize.Y
page.CanvasSize =
UDim2.new()
page.Visible =
false
page.Parent =
Content
local layout =
Instance.new(
"UIListLayout"
)
layout.Padding =
UDim.new(
0,
7
)
layout.SortOrder =
Enum.SortOrder.LayoutOrder
layout.Parent =
page
local button =
Instance.new(
"TextButton"
)
button.Size =
UDim2.new(
1,
0,
0,
44
)
button.BackgroundColor3 =
ButtonColor
button.BorderSizePixel =
0
button.AutoButtonColor =
false
button.Text =
""
button.Parent =
Navigation
local corner =
Instance.new(
"UICorner"
)
corner.CornerRadius =
UDim.new(
0,
9
)
corner.Parent =
button
local icon =
Instance.new(
"ImageLabel"
)
icon.Position =
UDim2.fromOffset(
10,
10
)
icon.Size =
UDim2.fromOffset(
23,
23
)
icon.BackgroundTransparency =
1
icon.Image =
"rbxassetid://" ..
tostring(
iconId
)
icon.ImageColor3 =
TextColor
icon.Parent =
button
local label =
Instance.new(
"TextLabel"
)
label.Position =
UDim2.fromOffset(
40,
0
)
label.Size =
UDim2.new(
1,
-45,
1,
0
)
label.BackgroundTransparency =
1
label.Font =
Enum.Font.GothamSemibold
label.TextSize =
11
label.TextColor3 =
TextColor
label.TextXAlignment =
Enum.TextXAlignment.Left
label.Text =
name
label.Parent =
button
local tab = {
Page =
page,
Button =
button,
Icon =
icon,
Label =
label,
}
Tabs[
name
] =
tab
button.MouseEnter:Connect(
function()
PlayHover()
end
)
button.MouseButton1Click:Connect(
function()
PlayClick()
SwitchTab(
name
)
end
)
return page
end
--============================================================
-- TAB ICONS
--============================================================
local HAMMER_ICON =
120310022500584
local EYE_ICON =
111235212335141
local GEAR_ICON =
104626039242165
--============================================================
-- CREATE TABS
--============================================================
local AutoPage =
CreateTab(
"Auto",
HAMMER_ICON
)
local ESPPage =
CreateTab(
"ESP",
EYE_ICON
)
local TagPage =
CreateTab(
"Tag",
HAMMER_ICON
)
local MovementPage =
CreateTab(
"Movement",
GEAR_ICON
)
local SettingsPage =
CreateTab(
"Settings",
GEAR_ICON
)
--============================================================
-- UI BUILDERS
--============================================================
local function AddSection(
parent,
text
)
local label =
Instance.new(
"TextLabel"
)
label.Size =
UDim2.new(
1,
-5,
0,
28
)
label.BackgroundTransparency =
1
label.Font =
Enum.Font.GothamBold
label.TextSize =
12
label.TextColor3 =
Accent
label.TextXAlignment =
Enum.TextXAlignment.Left
label.Text =
string.upper(
text
)
label.Parent =
parent
return label
end
local function AddButton(
parent,
text,
callback,
height
)
local button =
Instance.new(
"TextButton"
)
button.Size =
UDim2.new(
1,
-5,
0,
height or 42
)
button.BackgroundColor3 =
ButtonColor
button.BorderSizePixel =
0
button.AutoButtonColor =
false
button.Font =
Enum.Font.GothamMedium
button.TextSize =
13
button.TextColor3 =
TextColor
button.Text =
text
button.Parent =
parent
local corner =
Instance.new(
"UICorner"
)
corner.CornerRadius =
UDim.new(
0,
9
)
corner.Parent =
button
button.MouseEnter:Connect(
function()
PlayHover()
TweenService:Create(
button,
TweenInfo.new(
0.12
),
{
BackgroundColor3 =
Color3.fromRGB(
36,
36,
46
)
}
):Play()
end
)
button.MouseLeave:Connect(
function()
TweenService:Create(
button,
TweenInfo.new(
0.12
),
{
BackgroundColor3 =
ButtonColor
}
):Play()
end
)
button.MouseButton1Click:Connect(
function()
PlayClick()
if callback then
callback()
end
end
)
return button
end
local function AddToggle(
parent,
text,
description,
initial,
callback
)
local enabled =
initial
local holder =
Instance.new(
"TextButton"
)
holder.Size =
UDim2.new(
1,
-5,
0,
60
)
holder.BackgroundColor3 =
ButtonColor
holder.BorderSizePixel =
0
holder.AutoButtonColor =
false
holder.Text =
""
holder.Parent =
parent
local corner =
Instance.new(
"UICorner"
)
corner.CornerRadius =
UDim.new(
0,
9
)
corner.Parent =
holder
local title =
Instance.new(
"TextLabel"
)
title.Position =
UDim2.fromOffset(
13,
7
)
title.Size =
UDim2.new(
1,
-85,
0,
22
)
title.BackgroundTransparency =
1
title.Font =
Enum.Font.GothamSemibold
title.TextSize =
13
title.TextColor3 =
TextColor
title.TextXAlignment =
Enum.TextXAlignment.Left
title.Text =
text
title.Parent =
holder
local desc =
Instance.new(
"TextLabel"
)
desc.Position =
UDim2.fromOffset(
13,
30
)
desc.Size =
UDim2.new(
1,
-90,
0,
18
)
desc.BackgroundTransparency =
1
desc.Font =
Enum.Font.Gotham
desc.TextSize =
10
desc.TextColor3 =
MutedColor
desc.TextXAlignment =
Enum.TextXAlignment.Left
desc.Text =
description
desc.Parent =
holder
local switch =
Instance.new(
"Frame"
)
switch.AnchorPoint =
Vector2.new(
1,
0.5
)
switch.Position =
UDim2.new(
1,
-13,
0.5,
0
)
switch.Size =
UDim2.fromOffset(
42,
22
)
switch.BorderSizePixel =
0
switch.Parent =
holder
local switchCorner =
Instance.new(
"UICorner"
)
switchCorner.CornerRadius =
UDim.new(
1,
0
)
switchCorner.Parent =
switch
local dot =
Instance.new(
"Frame"
)
dot.AnchorPoint =
Vector2.new(
0.5,
0.5
)
dot.Size =
UDim2.fromOffset(
16,
16
)
dot.BackgroundColor3 =
Color3.fromRGB(
245,
245,
245
)
dot.BorderSizePixel =
0
dot.Parent =
switch
local dotCorner =
Instance.new(
"UICorner"
)
dotCorner.CornerRadius =
UDim.new(
1,
0
)
dotCorner.Parent =
dot
local function Update(
animated
)
local targetColor
local targetPosition
if enabled then
targetColor =
Accent
targetPosition =
UDim2.new(
1,
-11,
0.5,
0
)
else
targetColor =
Color3.fromRGB(
48,
48,
58
)
targetPosition =
UDim2.new(
0,
11,
0.5,
0
)
end
if animated then
TweenService:Create(
switch,
TweenInfo.new(
0.18
),
{
BackgroundColor3 =
targetColor
}
):Play()
TweenService:Create(
dot,
TweenInfo.new(
0.2,
Enum.EasingStyle.Quint,
Enum.EasingDirection.Out
),
{
Position =
targetPosition
}
):Play()
else
switch.BackgroundColor3 =
targetColor
dot.Position =
targetPosition
end
end
Update(false)
holder.MouseEnter:Connect(
function()
PlayHover()
end
)
holder.MouseButton1Click:Connect(
function()
PlayClick()
enabled =
not enabled
Update(true)
if callback then
callback(
enabled
)
end
end
)
return holder
end
local function AddNumberBox(
parent,
text,
value,
minimum,
maximum,
callback
)
local holder =
Instance.new(
"Frame"
)
holder.Size =
UDim2.new(
1,
-5,
0,
47
)
holder.BackgroundColor3 =
ButtonColor
holder.BorderSizePixel =
0
holder.Parent =
parent
local corner =
Instance.new(
"UICorner"
)
corner.CornerRadius =
UDim.new(
0,
9
)
corner.Parent =
holder
local label =
Instance.new(
"TextLabel"
)
label.Position =
UDim2.fromOffset(
13,
0
)
label.Size =
UDim2.new(
1,
-115,
1,
0
)
label.BackgroundTransparency =
1
label.Font =
Enum.Font.GothamSemibold
label.TextSize =
12
label.TextColor3 =
TextColor
label.TextXAlignment =
Enum.TextXAlignment.Left
label.Text =
text
label.Parent =
holder
local box =
Instance.new(
"TextBox"
)
box.AnchorPoint =
Vector2.new(
1,
0.5
)
box.Position =
UDim2.new(
1,
-11,
0.5,
0
)
box.Size =
UDim2.fromOffset(
75,
30
)
box.BackgroundColor3 =
Color3.fromRGB(
19,
19,
25
)
box.BorderSizePixel =
0
box.Font =
Enum.Font.GothamMedium
box.TextSize =
12
box.TextColor3 =
Color3.new(
1,
1,
1
)
box.Text =
tostring(
value
)
box.ClearTextOnFocus =
false
box.Parent =
holder
local boxCorner =
Instance.new(
"UICorner"
)
boxCorner.CornerRadius =
UDim.new(
0,
7
)
boxCorner.Parent =
box
box.FocusLost:Connect(
function()
local number =
tonumber(
box.Text
)
if not number then
box.Text =
tostring(
value
)
return
end
number =
math.clamp(
number,
minimum,
maximum
)
value =
number
box.Text =
tostring(
number
)
if callback then
callback(
number
)
end
end
)
return holder
end
local function AddRGB(
parent,
text,
color,
callback
)
local holder =
Instance.new(
"Frame"
)
holder.Size =
UDim2.new(
1,
-5,
0,
47
)
holder.BackgroundColor3 =
ButtonColor
holder.BorderSizePixel =
0
holder.Parent =
parent
local corner =
Instance.new(
"UICorner"
)
corner.CornerRadius =
UDim.new(
0,
9
)
corner.Parent =
holder
local title =
Instance.new(
"TextLabel"
)
title.Position =
UDim2.fromOffset(
12,
0
)
title.Size =
UDim2.fromOffset(
110,
47
)
title.BackgroundTransparency =
1
title.Font =
Enum.Font.GothamSemibold
title.TextSize =
11
title.TextColor3 =
TextColor
title.TextXAlignment =
Enum.TextXAlignment.Left
title.Text =
text
title.Parent =
holder
local values = {
math.floor(
color.R * 255
),
math.floor(
color.G * 255
),
math.floor(
color.B * 255
),
}
local boxes = {}
for i = 1, 3 do
local box =
Instance.new(
"TextBox"
)
box.Position =
UDim2.fromOffset(
108 +
((i - 1) * 48),
8
)
box.Size =
UDim2.fromOffset(
43,
30
)
box.BackgroundColor3 =
Color3.fromRGB(
19,
19,
25
)
box.BorderSizePixel =
0
box.Font =
Enum.Font.GothamMedium
box.TextSize =
11
box.TextColor3 =
Color3.fromRGB(
230,
230,
235
)
box.Text =
tostring(
values[i]
)
box.ClearTextOnFocus =
false
box.Parent =
holder
local c =
Instance.new(
"UICorner"
)
c.CornerRadius =
UDim.new(
0,
6
)
c.Parent =
box
boxes[i] =
box
end
local apply =
Instance.new(
"TextButton"
)
apply.AnchorPoint =
Vector2.new(
1,
0.5
)
apply.Position =
UDim2.new(
1,
-8,
0.5,
0
)
apply.Size =
UDim2.fromOffset(
52,
30
)
apply.BackgroundColor3 =
Accent
apply.BorderSizePixel =
0
apply.Font =
Enum.Font.GothamBold
apply.TextSize =
10
apply.TextColor3 =
Color3.fromRGB(
20,
20,
25
)
apply.Text =
"SET"
apply.Parent =
holder
local applyCorner =
Instance.new(
"UICorner"
)
applyCorner.CornerRadius =
UDim.new(
0,
6
)
applyCorner.Parent =
apply
apply.MouseEnter:Connect(
function()
PlayHover()
end
)
apply.MouseButton1Click:Connect(
function()
PlayClick()
local r =
math.clamp(
tonumber(
boxes[1].Text
)
or 255,
0,
255
)
local g =
math.clamp(
tonumber(
boxes[2].Text
)
or 255,
0,
255
)
local b =
math.clamp(
tonumber(
boxes[3].Text
)
or 255,
0,
255
)
local newColor =
Color3.fromRGB(
r,
g,
b
)
if callback then
callback(
newColor
)
end
end
)
return holder
end
--============================================================
-- AUTO PAGE
--============================================================
AddSection(
AutoPage,
"Automation"
)
AddToggle(
AutoPage,
"Auto Vault",
"Vault near Vault1 / Vault2 and dropped pallets.",
Config.AutoVault,
function(value)
Config.AutoVault =
value
if not value then
VaultLockedObject =
nil
end
end
)
AddNumberBox(
AutoPage,
"Vault Distance",
Config.VaultDistance,
1,
50,
function(value)
Config.VaultDistance =
value
end
)
AddNumberBox(
AutoPage,
"Vault Cooldown",
Config.AutoVaultCooldown,
1,
10,
function(value)
-- Hard minimum:
-- Auto Vault can NEVER be lower than 1 second.
Config.AutoVaultCooldown =
math.max(
1,
value
)
end
)
AddToggle(
AutoPage,
"Auto Break",
"Press SPACE near pallets as Chaser.",
Config.AutoBreak,
function(value)
Config.AutoBreak =
value
end
)
AddNumberBox(
AutoPage,
"Break Distance",
Config.BreakDistance,
1,
50,
function(value)
Config.BreakDistance =
value
end
)
AddNumberBox(
AutoPage,
"Break Cooldown",
Config.AutoBreakCooldown,
0.1,
5,
function(value)
Config.AutoBreakCooldown =
value
end
)
--============================================================
-- AUTO PALLET STUN UI
--============================================================
AddSection(
AutoPage,
"Auto Pallet Stun"
)
AddToggle(
AutoPage,
"Auto Pallet Stun",
"Drop ready Pallet when a Chaser gets close.",
Config.AutoPalletStun,
function(value)
Config.AutoPalletStun =
value
end
)
AddNumberBox(
AutoPage,
"Chaser Distance",
Config.PalletStunDistance,
1,
20,
function(value)
Config.PalletStunDistance =
value
end
)
AddNumberBox(
AutoPage,
"Drop Cooldown",
Config.PalletDropCooldown,
0.1,
5,
function(value)
Config.PalletDropCooldown =
value
end
)
AddButton(
AutoPage,
"Reset Vault Lock",
function()
VaultLockedObject =
nil
LastVaultTime =
0
Notify(
"Vault system re-armed."
)
end
)
--============================================================
-- ESP PAGE
--============================================================
AddSection(
ESPPage,
"Players"
)
AddToggle(
ESPPage,
"Player ESP",
"Role-colored player highlights.",
Config.PlayerESP,
function(value)
Config.PlayerESP =
value
end
)
AddNumberBox(
ESPPage,
"Player Distance",
Config.PlayerESPDistance,
10,
5000,
function(value)
Config.PlayerESPDistance =
value
end
)
AddToggle(
ESPPage,
"Player Names",
"Show player display names.",
Config.ShowPlayerNames,
function(value)
Config.ShowPlayerNames =
value
end
)
AddToggle(
ESPPage,
"Player Roles",
"Show Chaser / Runner / Eliminated.",
Config.ShowPlayerRoles,
function(value)
Config.ShowPlayerRoles =
value
end
)
AddToggle(
ESPPage,
"Player Health",
"Show current / maximum HP.",
Config.ShowPlayerHealth,
function(value)
Config.ShowPlayerHealth =
value
end
)
AddRGB(
ESPPage,
"Chaser RGB",
Config.ChaserColor,
function(color)
Config.ChaserColor =
color
end
)
AddRGB(
ESPPage,
"Runner RGB",
Config.RunnerColor,
function(color)
Config.RunnerColor =
color
end
)
AddRGB(
ESPPage,
"Eliminated RGB",
Config.EliminatedColor,
function(color)
Config.EliminatedColor =
color
end
)
AddSection(
ESPPage,
"Object ESP"
)
AddToggle(
ESPPage,
"Object ESP",
"Enable object highlights.",
Config.ObjectESP,
function(value)
Config.ObjectESP =
value
end
)
AddToggle(
ESPPage,
"Object Names",
"Show object names.",
Config.ShowObjectNames,
function(value)
Config.ShowObjectNames =
value
end
)
AddNumberBox(
ESPPage,
"Fill Transparency %",
math.floor(
Config.ObjectFillTransparency *
100
),
0,
100,
function(value)
Config.ObjectFillTransparency =
value / 100
end
)
AddNumberBox(
ESPPage,
"Outline Transparency %",
math.floor(
Config.ObjectOutlineTransparency *
100
),
0,
100,
function(value)
Config.ObjectOutlineTransparency =
value / 100
end
)
--============================================================
-- PALLET ESP
--============================================================
AddSection(
ESPPage,
"Pallets"
)
AddToggle(
ESPPage,
"Pallet",
"Highlight Pallet.",
ObjectSettings.Pallet.Enabled,
function(value)
ObjectSettings.Pallet.Enabled =
value
end
)
AddNumberBox(
ESPPage,
"Pallet Distance",
ObjectSettings.Pallet.Distance,
1,
5000,
function(value)
ObjectSettings.Pallet.Distance =
value
end
)
AddRGB(
ESPPage,
"Pallet RGB",
ObjectSettings.Pallet.Color,
function(color)
ObjectSettings.Pallet.Color =
color
end
)
AddToggle(
ESPPage,
"SmallPallet",
"Highlight SmallPallet.",
ObjectSettings.SmallPallet.Enabled,
function(value)
ObjectSettings.SmallPallet.Enabled =
value
end
)
AddNumberBox(
ESPPage,
"SmallPallet Distance",
ObjectSettings.SmallPallet.Distance,
1,
5000,
function(value)
ObjectSettings.SmallPallet.Distance =
value
end
)
AddRGB(
ESPPage,
"SmallPallet RGB",
ObjectSettings.SmallPallet.Color,
function(color)
ObjectSettings.SmallPallet.Color =
color
end
)
--============================================================
-- WINDOW ESP
--============================================================
AddSection(
ESPPage,
"Windows"
)
AddToggle(
ESPPage,
"Window",
"Highlight Window.",
ObjectSettings.Window.Enabled,
function(value)
ObjectSettings.Window.Enabled =
value
end
)
AddNumberBox(
ESPPage,
"Window Distance",
ObjectSettings.Window.Distance,
1,
5000,
function(value)
ObjectSettings.Window.Distance =
value
end
)
AddRGB(
ESPPage,
"Window RGB",
ObjectSettings.Window.Color,
function(color)
ObjectSettings.Window.Color =
color
end
)
AddToggle(
ESPPage,
"SmallWindow",
"Highlight SmallWindow.",
ObjectSettings.SmallWindow.Enabled,
function(value)
ObjectSettings.SmallWindow.Enabled =
value
end
)
AddNumberBox(
ESPPage,
"SmallWindow Distance",
ObjectSettings.SmallWindow.Distance,
1,
5000,
function(value)
ObjectSettings.SmallWindow.Distance =
value
end
)
AddRGB(
ESPPage,
"SmallWindow RGB",
ObjectSettings.SmallWindow.Color,
function(color)
ObjectSettings.SmallWindow.Color =
color
end
)
--============================================================
-- VAULT ESP
--============================================================
AddSection(
ESPPage,
"Vaults"
)
AddToggle(
ESPPage,
"Vault1",
"Highlight Vault1.",
ObjectSettings.Vault1.Enabled,
function(value)
ObjectSettings.Vault1.Enabled =
value
end
)
AddNumberBox(
ESPPage,
"Vault1 Distance",
ObjectSettings.Vault1.Distance,
1,
5000,
function(value)
ObjectSettings.Vault1.Distance =
value
end
)
AddRGB(
ESPPage,
"Vault1 RGB",
ObjectSettings.Vault1.Color,
function(color)
ObjectSettings.Vault1.Color =
color
end
)
AddToggle(
ESPPage,
"Vault2",
"Highlight Vault2.",
ObjectSettings.Vault2.Enabled,
function(value)
ObjectSettings.Vault2.Enabled =
value
end
)
AddNumberBox(
ESPPage,
"Vault2 Distance",
ObjectSettings.Vault2.Distance,
1,
5000,
function(value)
ObjectSettings.Vault2.Distance =
value
end
)
AddRGB(
ESPPage,
"Vault2 RGB",
ObjectSettings.Vault2.Color,
function(color)
ObjectSettings.Vault2.Color =
color
end
)
--============================================================
-- CUSTOM ESP
--============================================================
AddSection(
ESPPage,
"Custom ESP"
)
local CustomESPColor =
Color3.fromRGB(
255,
255,
255
)
local CustomESPDistance =
150
local CustomNameHolder =
Instance.new(
"Frame"
)
CustomNameHolder.Size =
UDim2.new(
1,
-5,
0,
47
)
CustomNameHolder.BackgroundColor3 =
ButtonColor
CustomNameHolder.BorderSizePixel =
0
CustomNameHolder.Parent =
ESPPage
local customNameCorner =
Instance.new(
"UICorner"
)
customNameCorner.CornerRadius =
UDim.new(
0,
9
)
customNameCorner.Parent =
CustomNameHolder
local CustomNameBox =
Instance.new(
"TextBox"
)
CustomNameBox.Position =
UDim2.fromOffset(
10,
8
)
CustomNameBox.Size =
UDim2.new(
1,
-125,
0,
30
)
CustomNameBox.BackgroundColor3 =
Color3.fromRGB(
19,
19,
25
)
CustomNameBox.BorderSizePixel =
0
CustomNameBox.Font =
Enum.Font.GothamMedium
CustomNameBox.TextSize =
11
CustomNameBox.TextColor3 =
Color3.new(
1,
1,
1
)
CustomNameBox.PlaceholderText =
"Object name..."
CustomNameBox.ClearTextOnFocus =
false
CustomNameBox.Parent =
CustomNameHolder
local customBoxCorner =
Instance.new(
"UICorner"
)
customBoxCorner.CornerRadius =
UDim.new(
0,
6
)
customBoxCorner.Parent =
CustomNameBox
local CustomAddButton =
Instance.new(
"TextButton"
)
CustomAddButton.AnchorPoint =
Vector2.new(
1,
0.5
)
CustomAddButton.Position =
UDim2.new(
1,
-8,
0.5,
0
)
CustomAddButton.Size =
UDim2.fromOffset(
100,
30
)
CustomAddButton.BackgroundColor3 =
Accent
CustomAddButton.BorderSizePixel =
0
CustomAddButton.Font =
Enum.Font.GothamBold
CustomAddButton.TextSize =
10
CustomAddButton.TextColor3 =
Color3.fromRGB(
20,
20,
25
)
CustomAddButton.Text =
"ADD ESP"
CustomAddButton.Parent =
CustomNameHolder
local customAddCorner =
Instance.new(
"UICorner"
)
customAddCorner.CornerRadius =
UDim.new(
0,
6
)
customAddCorner.Parent =
CustomAddButton
CustomAddButton.MouseEnter:Connect(
function()
PlayHover()
end
)
AddNumberBox(
ESPPage,
"Custom Distance",
CustomESPDistance,
1,
5000,
function(value)
CustomESPDistance =
value
end
)
AddRGB(
ESPPage,
"Custom RGB",
CustomESPColor,
function(color)
CustomESPColor =
color
end
)
CustomAddButton.MouseButton1Click:Connect(
function()
PlayClick()
local name =
CustomNameBox.Text
if name == "" then
Notify(
"Enter an object name."
)
return
end
AddCustomESP(
name,
CustomESPColor,
CustomESPDistance
)
Notify(
"Added ESP: " ..
name
)
CustomNameBox.Text =
""
end
)
--============================================================
-- TAG PAGE
--============================================================
AddSection(
TagPage,
"Tagging"
)
AddToggle(
TagPage,
"Auto Tag",
"Automatically follow the selected Runner.",
Config.AutoTag,
function(value)
if value
and not IsChaser() then
Notify(
"You aren't tagged!"
)
return
end
Config.AutoTag =
value
if value then
if not TagTarget
or GetRole(
TagTarget
) ~= "Runner" then
TagTarget =
FindNearestRunner(
Config.TagDistance
)
end
if TagTarget then
SaveTagPosition()
TagActive =
true
Notify(
"Auto Tag: " ..
TagTarget.DisplayName
)
else
Config.AutoTag =
false
Notify(
"No Runner found."
)
end
else
StopTagging(
true
)
end
end
)
AddNumberBox(
TagPage,
"Tag Distance",
Config.TagDistance,
5,
5000,
function(value)
Config.TagDistance =
value
end
)
AddNumberBox(
TagPage,
"Tag Interval",
Config.TagInterval,
0.05,
5,
function(value)
Config.TagInterval =
value
end
)
AddToggle(
TagPage,
"Return After Tag",
"Return to saved position after stopping.",
Config.ReturnAfterTag,
function(value)
Config.ReturnAfterTag =
value
end
)
AddButton(
TagPage,
"Tag Nearest Runner",
function()
if not IsChaser() then
Notify(
"You aren't tagged!"
)
return
end
local target =
FindNearestRunner(
Config.TagDistance
)
if not target then
Notify(
"No Runner within distance."
)
return
end
TagTarget =
target
SaveTagPosition()
TagActive =
true
Notify(
"Target: " ..
target.DisplayName
)
end
)
AddButton(
TagPage,
"Cycle Runner Target",
function()
if not IsChaser() then
Notify(
"You aren't tagged!"
)
return
end
local runners =
GetRunnerList()
if #runners == 0 then
Notify(
"No Runners."
)
return
end
local currentIndex =
0
for i, player in ipairs(
runners
) do
if player ==
TagTarget then
currentIndex =
i
break
end
end
local nextIndex =
currentIndex +
1
if nextIndex >
#runners then
nextIndex =
1
end
TagTarget =
runners[
nextIndex
]
Notify(
"Selected: " ..
TagTarget.DisplayName
)
end
)
AddButton(
TagPage,
"Stop Tagging",
function()
Config.AutoTag =
false
StopTagging(
true
)
Notify(
"Tagging stopped."
)
end
)
AddButton(
TagPage,
"Save Current Position",
function()
if RootPart then
OriginalTagPosition =
RootPart.CFrame
Notify(
"Position saved."
)
end
end
)
AddButton(
TagPage,
"Return To Saved Position",
function()
if OriginalTagPosition
and RootPart then
RootPart.CFrame =
OriginalTagPosition
OriginalTagPosition =
nil
Notify(
"Returned to saved position."
)
else
Notify(
"No position saved."
)
end
end
)
--============================================================
-- MOVEMENT PAGE
--============================================================
AddSection(
MovementPage,
"Movement"
)
AddToggle(
MovementPage,
"WalkSpeed Override",
"Continuously maintain the selected speed.",
Config.WalkSpeedEnabled,
function(value)
Config.WalkSpeedEnabled =
value
if not value
and Humanoid then
Humanoid.WalkSpeed =
16
end
end
)
AddNumberBox(
MovementPage,
"WalkSpeed",
Config.WalkSpeed,
1,
250,
function(value)
Config.WalkSpeed =
value
if Config.WalkSpeedEnabled
and Humanoid then
Humanoid.WalkSpeed =
value
end
end
)
AddButton(
MovementPage,
"Reset WalkSpeed",
function()
Config.WalkSpeed =
16
if Humanoid then
Humanoid.WalkSpeed =
16
end
Notify(
"WalkSpeed reset."
)
end
)
--============================================================
-- SETTINGS PAGE
--============================================================
AddSection(
SettingsPage,
"Interface"
)
AddToggle(
SettingsPage,
"UI Animations",
"Enable GUI tweens.",
Config.UIAnimations,
function(value)
Config.UIAnimations =
value
end
)
AddNumberBox(
SettingsPage,
"UI Scale %",
math.floor(
Config.UIScale *
100
),
70,
140,
function(value)
Config.UIScale =
value /
100
UIScale.Scale =
Config.UIScale
end
)
--============================================================
-- SETTINGS: SOUNDS
--============================================================
AddSection(
SettingsPage,
"Sounds"
)
AddToggle(
SettingsPage,
"Sounds",
"Enable Sha4kHub sounds.",
Config.SoundsEnabled,
function(value)
Config.SoundsEnabled =
value
end
)
AddToggle(
SettingsPage,
"Hover Sound",
"Hover sound 5852470908.",
Config.HoverSounds,
function(value)
Config.HoverSounds =
value
end
)
AddToggle(
SettingsPage,
"Click Sound",
"Click sound 140207837688369.",
Config.ClickSounds,
function(value)
Config.ClickSounds =
value
end
)
AddNumberBox(
SettingsPage,
"Sound Volume %",
math.floor(
Config.SoundVolume *
100
),
0,
100,
function(value)
Config.SoundVolume =
value /
100
end
)
--============================================================
-- SETTINGS: KEYBIND
--============================================================
AddSection(
SettingsPage,
"Keybind"
)
local KeybindButton
KeybindButton =
AddButton(
SettingsPage,
"Toggle Key: " ..
Config.ToggleKey.Name,
function()
Notify(
"Press a keyboard key..."
)
local connection
connection =
UserInputService.InputBegan:Connect(
function(
input,
processed
)
if processed then
return
end
if input.UserInputType ==
Enum.UserInputType.Keyboard then
Config.ToggleKey =
input.KeyCode
KeybindButton.Text =
"Toggle Key: " ..
Config.ToggleKey.Name
connection:Disconnect()
Notify(
"Key changed to " ..
Config.ToggleKey.Name
)
end
end
)
task.delay(
10,
function()
if connection then
connection:Disconnect()
end
end
)
end
)
--============================================================
-- SETTINGS: QUALITY OF LIFE
--============================================================
AddSection(
SettingsPage,
"Quality of Life"
)
AddToggle(
SettingsPage,
"Role Notifications",
"Notify when your role changes.",
Config.NotifyRoleChanges,
function(value)
Config.NotifyRoleChanges =
value
end
)
AddToggle(
SettingsPage,
"Automation Notifications",
"Notify about automation events.",
Config.NotifyAutomation,
function(value)
Config.NotifyAutomation =
value
end
)
AddButton(
SettingsPage,
"Reset Vault Lock",
function()
VaultLockedObject =
nil
LastVaultTime =
0
Notify(
"Vault system re-armed."
)
end
)
AddButton(
SettingsPage,
"Destroy Sha4kHub",
function()
for object in pairs(
ObjectESPObjects
) do
RemoveObjectESP(
object
)
end
for player in pairs(
PlayerESPObjects
) do
RemovePlayerESP(
player
)
end
ScreenGui:Destroy()
end
)
--============================================================
-- FLOATING BUTTON
--============================================================
local Floating =
Instance.new(
"TextButton"
)
Floating.AnchorPoint =
Vector2.new(
0,
0.5
)
Floating.Position =
UDim2.new(
0,
15,
0.5,
0
)
Floating.Size =
UDim2.fromOffset(
50,
50
)
Floating.BackgroundColor3 =
Color3.fromRGB(
24,
24,
31
)
Floating.BorderSizePixel =
0
Floating.AutoButtonColor =
false
Floating.Font =
Enum.Font.GothamBold
Floating.TextSize =
17
Floating.TextColor3 =
Accent
Floating.Text =
"S4"
Floating.Parent =
ScreenGui
local FloatingCorner =
Instance.new(
"UICorner"
)
FloatingCorner.CornerRadius =
UDim.new(
0,
12
)
FloatingCorner.Parent =
Floating
local FloatingStroke =
Instance.new(
"UIStroke"
)
FloatingStroke.Color =
Accent
FloatingStroke.Transparency =
0.35
FloatingStroke.Parent =
Floating
--============================================================
-- SHOW / HIDE GUI
--============================================================
local GUIVisible =
true
local OriginalMainSize =
UDim2.fromOffset(
600,
500
)
local function ToggleGUI()
GUIVisible =
not GUIVisible
if GUIVisible then
Main.Visible =
true
Main.Size =
UDim2.fromOffset(
550,
0
)
if Config.UIAnimations then
TweenService:Create(
Main,
TweenInfo.new(
0.3,
Enum.EasingStyle.Back,
Enum.EasingDirection.Out
),
{
Size =
OriginalMainSize
}
):Play()
else
Main.Size =
OriginalMainSize
end
else
if Config.UIAnimations then
local tween =
TweenService:Create(
Main,
TweenInfo.new(
0.2,
Enum.EasingStyle.Quint,
Enum.EasingDirection.In
),
{
Size =
UDim2.fromOffset(
550,
0
)
}
)
tween:Play()
tween.Completed:Once(
function()
if not GUIVisible then
Main.Visible =
false
end
end
)
else
Main.Visible =
false
end
end
end
Floating.MouseEnter:Connect(
function()
PlayHover()
TweenService:Create(
Floating,
TweenInfo.new(
0.15,
Enum.EasingStyle.Quint,
Enum.EasingDirection.Out
),
{
Size =
UDim2.fromOffset(
55,
55
)
}
):Play()
end
)
Floating.MouseLeave:Connect(
function()
TweenService:Create(
Floating,
TweenInfo.new(
0.15
),
{
Size =
UDim2.fromOffset(
50,
50
)
}
):Play()
end
)
Floating.MouseButton1Click:Connect(
function()
PlayClick()
ToggleGUI()
end
)
--============================================================
-- TOGGLE KEY
--============================================================
UserInputService.InputBegan:Connect(
function(
input,
processed
)
if processed then
return
end
if input.KeyCode ==
Config.ToggleKey then
ToggleGUI()
end
end
)
--============================================================
-- AUTOMATION LOOP
--============================================================
task.spawn(
function()
while ScreenGui.Parent do
if Character
and RootPart
and Humanoid then
--================================================
-- WALKSPEED
--================================================
if Config.WalkSpeedEnabled then
if Humanoid.WalkSpeed ~=
Config.WalkSpeed then
Humanoid.WalkSpeed =
Config.WalkSpeed
end
end
--================================================
-- AUTO PALLET STUN
--================================================
TryAutoPalletStun()
--================================================
-- AUTO VAULT
--================================================
TryAutoVault()
--================================================
-- AUTO BREAK
--================================================
TryAutoBreak()
end
task.wait(
0.05
)
end
end
)
--============================================================
-- TAG LOOP
--============================================================
task.spawn(
function()
while ScreenGui.Parent do
if Config.AutoTag then
-- Must remain Chaser.
if not IsChaser() then
Config.AutoTag =
false
StopTagging(
true
)
Notify(
"You aren't tagged!"
)
else
TagActive =
true
if not TagTarget
or not TagTarget.Parent
or GetRole(
TagTarget
) ~= "Runner" then
TagTarget =
FindNearestRunner(
Config.TagDistance
)
if not TagTarget then
Config.AutoTag =
false
StopTagging(
true
)
Notify(
"No Runner found."
)
end
end
if TagTarget then
if not OriginalTagPosition then
SaveTagPosition()
end
TeleportToTarget(
TagTarget
)
end
end
end
-- Manual / selected tagging.
if TagActive
and TagTarget
and not Config.AutoTag then
if not IsChaser() then
StopTagging(
true
)
elseif GetRole(
TagTarget
) ~= "Runner" then
StopTagging(
true
)
else
TeleportToTarget(
TagTarget
)
end
end
task.wait(
math.max(
0.05,
Config.TagInterval
)
)
end
end
)
--============================================================
-- ESP LOOP
--============================================================
task.spawn(
function()
while ScreenGui.Parent do
--================================================
-- PLAYER ESP
--================================================
for _, player in ipairs(
Players:GetPlayers()
) do
if player ~= LocalPlayer then
UpdatePlayerESP(
player
)
end
end
--================================================
-- OBJECT ESP
--================================================
for _, object in ipairs(
workspace:GetDescendants()
) do
if ObjectSettings[
object.Name
]
or
CustomObjects[
object.Name
] then
UpdateObjectESP(
object
)
end
end
task.wait(
0.2
)
end
end
)
--============================================================
-- WORKSPACE ESP EVENTS
--============================================================
workspace.DescendantAdded:Connect(
function(object)
if ObjectSettings[
object.Name
]
or
CustomObjects[
object.Name
] then
task.defer(
function()
local settings =
ObjectSettings[
object.Name
]
or
CustomObjects[
object.Name
]
if settings then
CreateObjectESP(
object,
settings
)
end
end
)
end
end
)
workspace.DescendantRemoving:Connect(
function(object)
RemoveObjectESP(
object
)
if VaultLockedObject ==
object then
VaultLockedObject =
nil
end
LastPalletDropTimes[
object
] = nil
end
)
--============================================================
-- PLAYER EVENTS
--============================================================
Players.PlayerAdded:Connect(
function(player)
player.CharacterAdded:Connect(
function()
task.wait(
0.4
)
if Config.PlayerESP then
CreatePlayerESP(
player
)
end
end
)
end
)
Players.PlayerRemoving:Connect(
function(player)
RemovePlayerESP(
player
)
if TagTarget ==
player then
TagTarget =
nil
if Config.AutoTag then
TagTarget =
FindNearestRunner(
Config.TagDistance
)
end
end
end
)
--============================================================
-- INITIAL PLAYER ESP
--============================================================
for _, player in ipairs(
Players:GetPlayers()
) do
if player ~= LocalPlayer then
if player.Character then
task.defer(
function()
CreatePlayerESP(
player
)
end
)
end
player.CharacterAdded:Connect(
function()
task.wait(
0.4
)
if Config.PlayerESP then
CreatePlayerESP(
player
)
end
end
)
end
end
--============================================================
-- ROLE WATCHER
--============================================================
local LastRole =
GetRole()
task.spawn(
function()
while ScreenGui.Parent do
local role =
GetRole()
RoleLabel.Text =
"Role: " ..
role
if role ~=
LastRole then
if Config.NotifyRoleChanges then
Notify(
"Role changed: " ..
role
)
end
--================================================
-- BECAME RUNNER
--================================================
if role ==
"Runner" then
Config.AutoTag =
false
TagActive =
false
ReturnToTagPosition()
TagTarget =
nil
end
--================================================
-- NO LONGER CHASER
--================================================
if role ~=
"Chaser" then
Config.AutoTag =
false
end
LastRole =
role
end
task.wait(
0.15
)
end
end
)
--============================================================
-- DEFAULT TAB
--============================================================
SwitchTab(
"Auto"
)
--============================================================
-- STARTUP
--============================================================
Notify(
"Sha4kHub loaded."
)
print(
"[Sha4kHub] Loaded."
)
print(
"[Sha4kHub] Role:",
GetRole()
)
print(
"[Sha4kHub] Auto Vault cooldown:",
Config.AutoVaultCooldown,
"second(s)"
)
print(
"[Sha4kHub] Auto Pallet Stun:",
Config.PalletStunDistance,
"stud trigger"
)