local function __KysHub_Init_Main__()
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Lighting = game:GetService("Lighting")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local Teams = game:GetService("Teams")
local GuiService = game:GetService("GuiService")
local VirtualInputManager = game:GetService("VirtualInputManager")
local LocalPlayer = Players.LocalPlayer
local Camera = Workspace.CurrentCamera
local Character, Humanoid, Root
local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
local UI = {}
local ok, result = pcall(require, "./src/Init")
local ModernV2 = ok and result or nil
if not ModernV2 then
-- Primary: Vercel mirror (no rate limit)
local loaderOk, loaderResult = pcall(function()
local source = game:HttpGet("https://raw.githubusercontent.com/Kys-lol/KysHubNewUI/refs/heads/main/ModernLua.txt")
local fn, compileErr = loadstring(source)
if not fn then error(compileErr) end
return fn()
end)
if loaderOk then
ModernV2 = loaderResult
else
warn("[KysHub] Vercel mirror failed, trying GitHub fallback:", loaderResult)
-- Fallback: GitHub raw (may be rate-limited)
local fallbackOk, fallbackResult = pcall(function()
local source = game:HttpGet("https://raw.githubusercontent.com/Kys-lol/KysHubNewUI/refs/heads/main/MainV2.lua")
local fn, compileErr = loadstring(source)
if not fn then error(compileErr) end
return fn()
end)
if fallbackOk then
ModernV2 = fallbackResult
else
warn("[KysHub] Failed to load ModernV2 from all sources:", fallbackResult)
end
end
end
if isMobile then UI.Mobile = true end
print("[Universal] Platform:", isMobile and "MOBILE" or "PC")
-- =====================================================
local HttpService = game:GetService("HttpService")
local UIConfigPath = "KysHub_UI_Theme.json"
local KysUI_Solid = false
local KysUI_Color = "Red"
pcall(function()
if isfile and readfile and isfile(UIConfigPath) then
local data = HttpService:JSONDecode(readfile(UIConfigPath))
KysUI_Solid = data.Solid
KysUI_Color = data.Color or "Red"
end
end)
if KysUI_Color == "Default" then
KysUI_Color = "Red"
end
-- =====================================================
if ModernV2 then
pcall(function()
ModernV2:AddTheme({
Name = "Lumi red",
Accent = Color3.fromRGB(255, 0, 0),
Outline = Color3.fromRGB(255, 0, 0),
Text = Color3.fromRGB(255, 255, 255),
PlaceholderText = Color3.fromRGB(200, 200, 200)
})
end)
end
local MenuIcon
if ModernV2 and ModernV2.CreateMenuIcon then
MenuIcon = ModernV2:CreateMenuIcon({
Image = "rbxassetid://80891639562743",
Size = 48,
IconColor = Color3.fromRGB(255, 255, 255),
BGColor = Color3.fromRGB(20, 22, 27),
StrokeColor = Color3.fromRGB(255, 0, 0),
StrokeThick = 1.5,
Draggable = true,
})
end
local Window
if ModernV2 then
-- =====================================
-- MAIN SCRIPT
-- =====================================
Window = ModernV2:Window({
Title = "KysHub",
Content = "Violence District v1.5.6",
Uitransparent = 0.15,
Size = UDim2.fromOffset(500, 320),
Color = Color3.fromRGB(255, 0, 0),
Image = "80891639562743",
ShowUser = true,
Search = true,
ConfigEnabled = true,
NotifyOnCallbackError = false,
Loadingscreen = false,
Enable3DRenderer = false,
Keybind = "RightControl",
Config = {
ConfigFolder = "KysHubViolenceDistrict",
AutoSaveFile = "KYS_VD",
AutoSave = false,
AutoLoad = false,
Overwrite = true,
Format = "JSON",
ShowAutoSaveToggle = true,
TextGradient = true,
}
})
if MenuIcon and Window.AttachMenuIcon then
Window:AttachMenuIcon(MenuIcon)
end
Window:SetAccount({
Username = LocalPlayer.DisplayName,
Profile = ModernV2.UserProfile,
Expires = "KysHubOnTop",
})
Window:CreateHomeTab({
Name = "Dashboard",
Icon = "lucide:layout-dashboard",
Content = "KysHub Violence District Script",
DiscordInvite = "",
SupportedExecutors = { "Delta", "Synapse X", "Krnl", "Codex", "Arceus X" },
UnsupportedExecutors = { "Roblox Studio" },
Segments = {
Details = { Text = "Details", Icon = "lucide:grid-2x2" },
Script = { Text = "Script Logs", Icon = "lucide:code" },
UI = { Text = "UI Logs", Icon = "lucide:file-text", Show = true }
},
Changelog = {
{
Title = "KysHub VD v1.5.6",
Description = "Improved Weather & Sky Theme particles and fixed Fullbright compatibility with active weather themes.",
},
{
Title = "KysHub VD v1.5.5",
Description = "Improved Aimbot, Spear Aimbot, Silent Aim Spear, and added new Auto Dodge Spear feature.",
},
{
Title = "KysHub VD v1.5.4",
Description = "Added Fake Parry, Fake Generator, Fake Attack, and fixed Infinite Skills backend.",
},
{
Title = "KysHub VD v1.5.3",
Description = "Added Auto Drop All Pallets, Break All Pallet, Show Hook Counter. Removed Copy Avatar.",
},
{
Title = "KysHub VD v1.5.2",
Description = "Added internal info panels and Moonwalk external toggle button with lock support.",
},
{
Title = "KysHub VD v1.5.1",
Description = "Added Silent Aim Flashlight with laser support and Premium-only access.",
},
{
Title = "KysHub VD v1.5.0",
Description = "Added ToF features, Hide Survivor Icon, and Show Ping & FPS.",
},
{
Title = "KysHub VD v1.4.9",
Description = "Added Killer Perks Display and Predict Map display, refined Predict Map UI output.",
},
{
Title = "KysHub VD v1.4.8",
Description = "Added Spectator Counter, updated Player Emote logic, fixed Spear tabbox icon.",
},
{
Title = "KysHub VD v1.4.7",
Description = "Added Apply Korless cosmetic morph, fixed Instant Skillcheck & Cooldown Bypass logic.",
},
{
Title = "KysHub VD v1.4.6",
Description = "Added Kyst Killer Display, Fixed TP to Gen scoping issues, Optimized metatable hooks.",
},
{
Title = "KysHub VD v1.4.5",
Description = "Added No Cutscene and Premium lock updates.",
},
{
Title = "KysHub VD v1.4.4",
Description = "Added Auto Kick Generator, Fixed Cooldown & Freezing issues.",
},
{
Title = "KysHub VD v1.4.3",
Description = "Improved Auto Parry, Added Auto Parry Agresif, Fixed Auto Crouch.",
},
},
UIChangelog = {
{
Title = "ModernV2 Framework",
Date = "Latest",
Description = "Added Lumi red Theme",
},
}
})
end
-- =====================================================
-- PC CURSOR UNLOCK (ALT key toggle)
-- Hanya aktif di PC, tidak mengganggu mobile
-- =====================================================
if not isMobile then
local _cursorOn = false
local _cursorManual = false
local function _setCursor(state)
_cursorOn = state
_cursorManual = true
pcall(function()
UserInputService.MouseIconEnabled = state
UserInputService.MouseBehavior = state
and Enum.MouseBehavior.Default
or Enum.MouseBehavior.LockCenter
end)
local char = LocalPlayer.Character
local humanoid = char and char:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.AutoRotate = not state
end
end
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if input.KeyCode == Enum.KeyCode.LeftAlt or input.KeyCode == Enum.KeyCode.RightAlt then
_setCursor(not _cursorOn)
end
end)
task.spawn(function()
while true do
if _cursorManual then
pcall(function()
if _cursorOn then
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
UserInputService.MouseIconEnabled = true
else
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseIconEnabled = false
end
end)
end
task.wait(0.1)
end
end)
LocalPlayer.CharacterAdded:Connect(function()
task.wait(1)
if _cursorOn then _setCursor(true) end
end)
print("[VD] ALT Toggle Cursor Ready (PC only)")
end
-- =====================================================
-- SAFE DRAWING UTILS
-- =====================================================
local DrawingAvailable = (function()
if isMobile then return false end --
local ok, result = pcall(function()
return typeof(Drawing) == "table" and Drawing.new ~= nil
end)
return ok and result or false
end)()
function SafeDrawing(typ)
if not DrawingAvailable then return nil end
local ok, res = pcall(function() return Drawing.new(typ) end)
return ok and res or nil
end
function SafeRemove(obj)
if obj and obj.Remove then pcall(function() obj:Remove() end) end
end
local MobileESP = {}
-- =====================================================
-- UTILITY FUNCTIONS
-- =====================================================
function clamp(v, min, max)
return math.max(min, math.min(max, v))
end
-- =====================================================
-- CONFIG
-- =====================================================
getgenv().VD = getgenv().VD or {
-- Generator / Healing
AutoSkillcheck = false,
AutoSkillcheckMode = "Normal",
-- Visual / UI
HideSkillUI = false,
Fullbright = false,
-- Movement
Speed = false,
SpeedValue = 16,
Jump = false,
JumpValue = 50,
InfiniteJump = false,
Noclip = false,
Moonwalk = false,
MoonwalkButton = false,
MoonwalkButtonLocked = false,
MoonwalkZigzagSpeed = 11,
MoonwalkBoostPower = 1.08,
AimLock = false,
AimLockButton = false,
AimLockButtonLocked = false,
AimLockMaxDistance = 50,
InvisibleNotVisual = false,
InvisibleSpeed = 5,
AntiAFK = false,
BypassGate = false,
-- Internal
Destroyed = false,
-- Auto features
AUTO_LeaveGen = false,
AUTO_LeaveDist = 18,
AUTO_Attack = false,
AUTO_AttackRange = 12,
HITBOX_Enabled = false,
HITBOX_Size = 15,
TOF_SilentAim = false,
TOF_Laser = true,
TOF_WallCheck = false,
TOF_BlockKnocked = true,
TOF_TargetMode = "Killer",
TOF_Key = "None",
FLASH_SilentAim = false,
FLASH_Laser = true,
FLASH_TargetPart = "Head",
FLASH_Range = 120,
FLASH_Smooth = 0.35,
SURV_FleeKiller = false,
SURV_FleeDistance = 40,
SURV_SwiftVault = false, -- Auto Vault saat dekat window
SURV_SwiftVaultV2 = false, -- Custom vault speed
SURV_SwiftVaultSpeed = 13,
SURV_AutoPallet = false, -- Auto Pallet Drop saat killer dekat
SURV_AutoPalletDist = 20, -- Jarak killer (studs) untuk trigger pallet drop
SURV_AutoParry = false,
SURV_ParryDistance = 8,
SURV_ShowParryCircle = false,
SURV_FakeParry = false,
SURV_FakeParryAnim = "Enten",
SURV_FakeGen = false,
SURV_AntiKnock = false,
-- Killer features
KILLER_DestroyPallets = false,
KILLER_NoPalletStun = false,
KILLER_AutoHook = false,
KILLER_AutoBreakGene = false,
KILLER_BlockVaults = false,
KILLER_BlockPallets = false,
KILLER_BlockPalletDrop = false,
KILLER_BypassCooldown = false,
KILLER_BypassLeap = false,
KILLER_AntiBlind = false,
KILLER_NoSlowdown = false,
KILLER_CustomMasked = "Richard",
-- Speed
SPEED_Enabled = false,
SPEED_Value = 32,
SPEED_Method = "Attribute",
-- Visual extras
NO_Fog = false,
NoCutscene = false,
CAM_FOVEnabled = false,
CAM_FOV = 90,
CAM_ThirdPerson = false,
CAM_ShiftLock = false,
CAM_InfinityZoom = false,
-- Config
AntiFallDamage = false,
FLING_Enabled = false,
FLING_Strength = 10000,
-- Beat game
BEAT_Survivor = false,
BEAT_Killer = false,
TP_Offset = 3,
VIS_KystKiller = false,
VIS_SpectatorCounter = false,
VIS_KillerPerks = false,
VIS_PredictMap = false,
VIS_HideSurvivorIcon = false,
VIS_ShowPingFPS = false,
VIS_ShowHookCounter = false,
VIS_WeatherTheme = "Default",
CROSS_Enabled = false,
CROSS_Style = "Dot",
CROSS_Size = 3,
CROSS_Thickness = 4,
CROSS_Gap = 6,
CROSS_PosX = 0,
CROSS_PosY = 0,
CROSS_Color = Color3.fromRGB(255, 255, 255),
ESP_ClosestHook = false, -- Aimbot
AIM_Enabled = false,
AIM_UseRMB = false,
AIM_FOV = 120,
AIM_Smooth = 0.3,
AIM_TargetPart = "Head",
AIM_VisCheck = false,
AIM_ShowFOV = false,
AIM_Predict = false,
SURV_FirstPerson = false,
-- Spear aimbot
SPEAR_Aimbot = false,
SPEAR_Gravity = 50,
SPEAR_Speed = 100,
-- Radar
RADAR_Enabled = false,
RADAR_Size = 150,
RADAR_Range = 250,
RADAR_Transparency = 0.2,
RADAR_Circle = false,
RADAR_ShowKiller = false,
RADAR_ShowSurvivor = false,
RADAR_ShowGenerator = false,
RADAR_ShowPallet = false,
RADAR_ShowHook = false,
RADAR_ShowGate = false,
RADAR_ShowWindow = false,
RADAR_ShowZombie = false,
SURV_WarnKiller = false,
SURV_AutoDodgeSpear = false
}
local VD = getgenv().VD
-- =====================================================
-- ADVANCED CROSSHAIR (GUI Fallback / Port)
-- =====================================================
local CrosshairGui = nil
function clearCrosshair()
if CrosshairGui then
pcall(function() CrosshairGui:Destroy() end)
CrosshairGui = nil
end
end
function VD_UpdateCrosshair()
clearCrosshair()
if not VD.CROSS_Enabled then return end
local cam = workspace.CurrentCamera
if not cam then return end
local style = VD.CROSS_Style or "Dot"
local size = tonumber(VD.CROSS_Size) or 3
local gap = tonumber(VD.CROSS_Gap) or 6
local thick = tonumber(VD.CROSS_Thickness) or 4
local color = typeof(VD.CROSS_Color) == "Color3" and VD.CROSS_Color or Color3.fromRGB(255, 255, 255)
local offsetX = tonumber(VD.CROSS_PosX) or 0
local offsetY = tonumber(VD.CROSS_PosY) or 0
local ok, core = pcall(function() return game:GetService("CoreGui") end)
local parent = (ok and core) and core or game:GetService("Players").LocalPlayer:FindFirstChild("PlayerGui")
if not parent then return end
CrosshairGui = Instance.new("ScreenGui")
CrosshairGui.Name = "KYS_Crosshair"
CrosshairGui.DisplayOrder = 999999
CrosshairGui.IgnoreGuiInset = true
CrosshairGui.Parent = parent
local centerFrame = Instance.new("Frame")
centerFrame.Name = "Center"
centerFrame.BackgroundTransparency = 1
centerFrame.Position = UDim2.new(0.5, offsetX, 0.5, offsetY)
centerFrame.Size = UDim2.new(0,0,0,0)
centerFrame.Parent = CrosshairGui
if style == "Dot" then
local dot = Instance.new("Frame")
dot.AnchorPoint = Vector2.new(0.5, 0.5)
dot.Size = UDim2.new(0, size * 2, 0, size * 2)
dot.BackgroundColor3 = color
dot.BorderSizePixel = 0
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(1, 0)
corner.Parent = dot
dot.Parent = centerFrame
elseif style == "Plus" or style == "X" then
local length = size * 3
for i = 1, 4 do
local line = Instance.new("Frame")
line.AnchorPoint = Vector2.new(0.5, 0.5)
line.BackgroundColor3 = color
line.BorderSizePixel = 0
local angle = (i - 1) * 90
if style == "X" then angle = angle + 45 end
line.Rotation = angle
line.Size = UDim2.new(0, length, 0, thick)
local rad = math.rad(angle)
local dirX = math.cos(rad)
local dirY = math.sin(rad)
local dist = gap + (length / 2)
-- Snap values to avoid weird float sub-pixel rendering blur
line.Position = UDim2.new(0, math.floor(dirX * dist + 0.5), 0, math.floor(dirY * dist + 0.5))
line.Parent = centerFrame
end
elseif style == "Box" then
local half = gap + size * 2
local t = Instance.new("Frame")
t.BackgroundColor3 = color; t.BorderSizePixel = 0; t.AnchorPoint = Vector2.new(0.5, 0.5)
t.Size = UDim2.new(0, half * 2 + thick, 0, thick)
t.Position = UDim2.new(0, 0, 0, -half)
t.Parent = centerFrame
local b = Instance.new("Frame")
b.BackgroundColor3 = color; b.BorderSizePixel = 0; b.AnchorPoint = Vector2.new(0.5, 0.5)
b.Size = UDim2.new(0, half * 2 + thick, 0, thick)
b.Position = UDim2.new(0, 0, 0, half)
b.Parent = centerFrame
local l = Instance.new("Frame")
l.BackgroundColor3 = color; l.BorderSizePixel = 0; l.AnchorPoint = Vector2.new(0.5, 0.5)
l.Size = UDim2.new(0, thick, 0, half * 2 - thick)
l.Position = UDim2.new(0, -half, 0, 0)
l.Parent = centerFrame
local r = Instance.new("Frame")
r.BackgroundColor3 = color; r.BorderSizePixel = 0; r.AnchorPoint = Vector2.new(0.5, 0.5)
r.Size = UDim2.new(0, thick, 0, half * 2 - thick)
r.Position = UDim2.new(0, half, 0, 0)
r.Parent = centerFrame
end
end
getgenv().VD_UpdateCrosshair = VD_UpdateCrosshair
-- All runtime features are intentionally reset on every execute.
-- This prevents stale getgenv/config/UI state from enabling anything
-- before the user turns it on manually.
local VD_DefaultOffFlags = {
"AutoSkillcheck",
"HideSkillUI",
"Fullbright",
"Speed",
"Jump",
"InfiniteJump",
"Noclip",
"Moonwalk",
"MoonwalkButton",
"MoonwalkButtonLocked",
"AimLock",
"AimLockButton",
"AimLockButtonLocked",
"AimLockMaxDistance",
"InvisibleNotVisual",
"AntiAFK",
"BypassGate",
"AUTO_Attack",
"HITBOX_Enabled",
"TOF_SilentAim",
"FLASH_SilentAim",
"SURV_FleeKiller",
"SURV_SwiftVault",
"SURV_SwiftVaultV2",
"SURV_AutoPallet",
"SURV_AutoParry",
"SURV_ShowParryCircle",
"SURV_FakeParry",
"SURV_FakeParryAnim",
"SURV_FakeGen",
"SURV_AntiKnock",
"KILLER_DestroyPallets",
"KILLER_NoPalletStun",
"KILLER_AutoHook",
"KILLER_AutoBreakGene",
"KILLER_BlockVaults",
"KILLER_BlockPallets",
"KILLER_BlockPalletDrop",
"KILLER_BypassCooldown",
"KILLER_BypassLeap",
"KILLER_BypassVeilCooldown",
"KILLER_AntiBlind",
"KILLER_NoSlowdown",
"SPEED_Enabled",
"NO_Fog",
"NoCutscene",
"VIS_KystKiller",
"CAM_FOVEnabled",
"CAM_ThirdPerson",
"CAM_ShiftLock",
"CAM_InfinityZoom",
"AntiFallDamage",
"FLING_Enabled",
"BEAT_Survivor",
"BEAT_Killer",
"ESP_ClosestHook",
"VIS_SpectatorCounter",
"VIS_KillerPerks",
"VIS_PredictMap",
"VIS_HideSurvivorIcon",
"VIS_ShowPingFPS",
"VIS_ShowHookCounter",
"CROSS_Enabled",
"CROSS_Style",
"CROSS_Size",
"CROSS_Thickness",
"CROSS_Gap",
"CROSS_PosX",
"CROSS_PosY",
"CROSS_Color",
"AIM_Enabled",
"AIM_UseRMB",
"AIM_VisCheck",
"AIM_ShowFOV",
"AIM_Predict",
"SURV_FirstPerson",
"SPEAR_Aimbot",
"RADAR_Enabled",
"RADAR_Circle",
"RADAR_ShowKiller",
"RADAR_ShowSurvivor",
"RADAR_ShowGenerator",
"RADAR_ShowPallet",
"RADAR_ShowHook",
"RADAR_ShowGate",
"RADAR_ShowWindow",
"RADAR_ShowZombie",
"SURV_WarnKiller",
}
for _, flagName in ipairs(VD_DefaultOffFlags) do
VD[flagName] = false
end
if VD.TOF_Laser == nil then VD.TOF_Laser = true end
if VD.TOF_WallCheck == nil then VD.TOF_WallCheck = false end
if VD.TOF_BlockKnocked == nil then VD.TOF_BlockKnocked = true end
if VD.TOF_TargetMode == nil then VD.TOF_TargetMode = "Killer" end
if VD.TOF_Key == nil then VD.TOF_Key = "None" end
if VD.FLASH_TargetPart == nil then VD.FLASH_TargetPart = "Head" end
if VD.FLASH_Laser == nil then VD.FLASH_Laser = true end
if VD.FLASH_Range == nil then VD.FLASH_Range = 120 end
if VD.FLASH_Smooth == nil then VD.FLASH_Smooth = 0.35 end
-- =====================================================
-- CONFIGURATION SYSTEM (Save & Load)
-- =====================================================
function GetSafeGuiParent()
if gethui then return gethui() end
local ok, core = pcall(function() return game:GetService("CoreGui") end)
if ok and core then return core end
return LocalPlayer:FindFirstChild("PlayerGui")
end
local VD_ChamsFolder = nil
function GetSafeChamsFolder()
local pg = GetSafeGuiParent()
if not pg then return workspace end
if VD_ChamsFolder and VD_ChamsFolder.Parent then return VD_ChamsFolder end
local f = pg:FindFirstChild("KYS_WorkspaceChams")
if not f then
f = Instance.new("Folder")
f.Name = "KYS_WorkspaceChams"
f.Parent = pg
end
VD_ChamsFolder = f
return f
end
local ConfigFolderName = "KysHub_VD"
local HttpService = game:GetService("HttpService")
if makefolder and isfolder and not isfolder(ConfigFolderName) then
makefolder(ConfigFolderName)
end
getgenv().CurrentConfigName = "Default"
function GetConfigList()
local list = {}
if listfiles and isfolder and isfolder(ConfigFolderName) then
for _, file in pairs(listfiles(ConfigFolderName)) do
if file:sub(-5) == ".json" then
local filename = file:match("([^/\\]+)%.json$")
if filename then
table.insert(list, filename)
end
end
end
end
if #list == 0 then table.insert(list, "Default") end
return list
end
function KYS_SaveConfig(name)
name = (name and name ~= "") and name or getgenv().CurrentConfigName
if not name or name == "" then name = "Default" end
local path = ConfigFolderName .. "/" .. name .. ".json"
pcall(function()
if writefile then
writefile(path, HttpService:JSONEncode(VD))
end
end)
end
local VD_To_Flag = {
InfiniteJump = "Infinite Jump",
KILLER_AntiBlind = "Anti Blind (Flashlight)",
Fullbright = "Fullbright (lighting preset)",
AIM_VisCheck = "Visibility Check",
AutoSkillcheck = "Auto Skillcheck",
AutoSkillcheckMode = "Skillcheck Mode",
HideSkillUI = "Hide Skillcheck UI",
SpeedValue = "Speed Value",
AIM_Enabled = "Enable Aimbot",
HITBOX_Size = "Hitbox Size",
SURV_FleeKiller = "Flee Killer",
SURV_FleeDistance = "Flee Distance",
SURV_AutoVault = "SwiftVault",
SURV_FastVault = "SwiftVaultV2",
SURV_VaultSpeed = "SwiftVaultSpeed",
SURV_AutoPallet = "Pallet Reflex",
SURV_AutoPalletDist = "Pallet Trigger Range",
SURV_AutoParry = "Auto Parry",
SURV_ParryDistance = "Parry Distance Trigger",
SURV_ShowParryCircle = "Show Parry Range Circle",
SURV_FakeParry = "Fake Parry (Press V)",
SURV_FakeParryAnim = "Fake Parry Animation",
SURV_FakeGen = "Fake Generator (Press B)",
SURV_AntiKnock = "Anti Knock",
KILLER_DestroyPallets = "Destroy Pallets",
KILLER_AutoBreakGene = "Auto Kick Generator",
KILLER_BlockVaults = "Block All Vaults",
KILLER_BlockPallets = "Auto Drop All Pallets",
KILLER_BlockPalletDrop = "Break All Pallet",
KILLER_BypassCooldown = "Infinite Abyssal Burst (Abyss)",
KILLER_BypassLeap = "Infinite Skill (Hidden)",
KILLER_FakeAttack = "Fake Attack (Counter Parry)",
KILLER_BypassVeilCooldown = "Bypass Cooldown (Veil)",
KILLER_CustomMasked = "Custom Masked",
Speed = "Speed Hack",
CAM_FOV = "Camera FOV",
CAM_FOVEnabled = "Enable Camera FOV override",
FLING_Strength = "Fling Strength",
Noclip = "Noclip",
Moonwalk = "Moonwalk",
MoonwalkButton = "Moonwalk",
MoonwalkButtonLocked = "Lock Moonwalk Button",
MoonwalkZigzagSpeed = "Moonwalk Zigzag Speed",
MoonwalkBoostPower = "Moonwalk Boost Power",
AimLock = "Target Lock",
AimLockButton = "Target Lock",
AimLockButtonLocked = "Lock Target Lock Button",
AimLockMaxDistance = "Target Lock Max Distance",
BEAT_Killer = "Beat Killer (auto kill)",
AIM_Predict = "Prediction",
AIM_ShowFOV = "Show FOV Circle",
KILLER_AutoHook = "Auto Hook",
Jump = "Jump Hack",
KILLER_NoSlowdown = "No Slowdown",
SPEAR_Gravity = "Spear Gravity",
AIM_UseRMB = "Use RMB to aim",
CAM_ShiftLock = "Shift Lock (auto face camera)",
Destroyed = "Solid UI Mode (No Transparency)",
AUTO_AttackRange = "Attack Range",
AIM_FOV = "FOV Size (aim radius on screen)",
KILLER_NoPalletStun = "Remove Palletwrong (All)",
CAM_ThirdPerson = "Third Person (Killer only)",
CAM_InfinityZoom = "Infinity Zoom Out",
AntiFallDamage = "Anti Fall Damage",
InvisibleNotVisual = "Invisible Not Visual",
InvisibleSpeed = "Invisible Speed",
AntiAFK = "Anti AFK",
BypassGate = "Bypass Gate",
HITBOX_Enabled = "Hitbox Expand",
TOF_SilentAim = "Silent Aim Twist Of Fate",
TOF_Laser = "ToF Laser",
TOF_WallCheck = "ToF Wall Check",
TOF_BlockKnocked = "ToF Block When Knocked",
TOF_TargetMode = "ToF Target Mode",
TOF_Key = "Silent Aim Key",
FLASH_SilentAim = "Silent Aim Flashlight",
FLASH_Laser = "Flashlight Laser",
FLASH_TargetPart = "Flashlight Target Part",
FLASH_Range = "Flashlight Range",
FLASH_Smooth = "Flashlight Smoothness",
NO_Fog = "No Fog (remove fog/post effects)",
NoCutscene = "No Cutscene",
FLING_Enabled = "Enable Fling",
AIM_Smooth = "Smoothness",
SPEAR_Speed = "Spear Speed",
SPEAR_Aimbot = "Spear Aimbot",
SURV_FirstPerson = "First Person Camera (Survivor)",
JumpValue = "Jump Power",
AUTO_Attack = "Auto Attack",
BEAT_Survivor = "Beat Survivor (auto exit)",
SURV_WarnKiller = "Survivor Killer Warning",
VIS_KystKiller = "Kyst Killer Display",
VIS_SpectatorCounter = "Enable Spectator Counter",
VIS_KillerPerks = "Killer Perks Display",
VIS_PredictMap = "Predict Map",
VIS_HideSurvivorIcon = "Hide Survivor Icon",
VIS_ShowPingFPS = "Show Ping & FPS",
VIS_ShowHookCounter = "Show Hook Counter",
}
function KYS_LoadConfig(name)
name = (name and name ~= "") and name or getgenv().CurrentConfigName
if not name or name == "" then name = "Default" end
local path = ConfigFolderName .. "/" .. name .. ".json"
pcall(function()
if readfile and isfile and isfile(path) then
local data = HttpService:JSONDecode(readfile(path))
for key, value in pairs(data) do
VD[key] = value
-- Sync to UI visual state if mapping exists
local flagName = VD_To_Flag[key]
if flagName and Window and Window.ConfigElements and Window.ConfigElements[flagName] then
pcall(function()
local elem = Window.ConfigElements[flagName]
if elem.Set then elem:Set(value) end
end)
end
end
if getgenv().KYS_SyncLoadedFeatures then pcall(getgenv().KYS_SyncLoadedFeatures) end
end
end)
end
function KYS_DeleteConfig(name)
name = (name and name ~= "") and name or getgenv().CurrentConfigName
if not name or name == "" or name == "Default" then return end
local path = ConfigFolderName .. "/" .. name .. ".json"
pcall(function()
if isfile and isfile(path) and delfile then
delfile(path)
print("[VD Config] Deleted:", name)
end
end)
end
-- Auto-load dimatikan: config hanya dimuat saat user memilih Load manual dari UI.
-- =====================================================
-- SAVE ORIGINAL LIGHTING
-- =====================================================
local originalLighting = {
Brightness = Lighting.Brightness,
ClockTime = Lighting.ClockTime,
FogEnd = Lighting.FogEnd,
FogStart = Lighting.FogStart,
GlobalShadows = Lighting.GlobalShadows,
OutdoorAmbient = Lighting.OutdoorAmbient
}
do
local atm = Lighting:FindFirstChildOfClass("Atmosphere")
local blur = Lighting:FindFirstChildOfClass("BlurEffect")
local cc = Lighting:FindFirstChildOfClass("ColorCorrectionEffect")
local sr = Lighting:FindFirstChildOfClass("SunRaysEffect")
if atm then
originalLighting.Atmosphere = {
Density = atm.Density,
Offset = atm.Offset,
Glare = atm.Glare,
Haze = atm
.Haze
}
end
if blur then originalLighting.Blur = { Size = blur.Size } end
if cc then originalLighting.ColorCorrection = { Enabled = cc.Enabled } end
if sr then originalLighting.SunRays = { Enabled = sr.Enabled } end
end
-- =====================================================
-- WEATHER ENGINE
-- =====================================================
getgenv().VD_CurrentSky = nil
getgenv().VD_ParticleAnchor = nil
local KYS_WeatherPresets = {
["Default"] = {},
["Christmas (Snow)"] = {
Lighting = { FogColor = Color3.fromRGB(150, 180, 220), FogEnd = 200, ClockTime = 8, OutdoorAmbient = Color3.fromRGB(100, 120, 150) },
Atmosphere = { Density = 0.5, Color = Color3.fromRGB(180, 200, 220), Decay = Color3.fromRGB(150, 180, 220), Haze = 5, Glare = 0 },
Particle = { Texture = "rbxasset://textures/particles/sparkles_main.dds", Color = ColorSequence.new(Color3.fromRGB(255, 255, 255)), Size = NumberSequence.new(1.5), Rate = 150, Speed = NumberRange.new(15, 25), Lifetime = NumberRange.new(4, 6), EmissionDirection = Enum.NormalId.Bottom, RotSpeed = NumberRange.new(-45, 45) }
},
["Heavy Rain (Storm)"] = {
Lighting = { FogColor = Color3.fromRGB(50, 50, 60), FogEnd = 150, OutdoorAmbient = Color3.fromRGB(40, 40, 50), Brightness = 0.2, ClockTime = 12 },
CC = { TintColor = Color3.fromRGB(150, 150, 180), Contrast = 0.2, Saturation = -0.5 },
Particle = { Texture = "rbxasset://textures/particles/sparkles_main.dds", AnchorSize = Vector3.new(260, 1, 260), CameraOffset = Vector3.new(0, 38, -18), Squash = NumberSequence.new(16), Color = ColorSequence.new(Color3.fromRGB(235, 245, 255)), Size = NumberSequence.new(1.25), Rate = 2600, Speed = NumberRange.new(110, 145), Lifetime = NumberRange.new(0.85, 1.25), EmissionDirection = Enum.NormalId.Bottom, Transparency = NumberSequence.new(0), Acceleration = Vector3.new(-18, -75, 0), SpreadAngle = Vector2.new(3, 3), LightEmission = 1 }
},
["Autumn (Musim Gugur)"] = {
Lighting = { FogColor = Color3.fromRGB(200, 150, 80), FogEnd = 500, OutdoorAmbient = Color3.fromRGB(180, 140, 70), ClockTime = 16.5 },
CC = { TintColor = Color3.fromRGB(255, 220, 180), Contrast = 0.1, Saturation = 0.2 },
Particle = { Texture = "rbxasset://textures/particles/sparkles_main.dds", AnchorSize = Vector3.new(210, 1, 210), CameraOffset = Vector3.new(0, 28, -16), Squash = NumberSequence.new(3.2), Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 190, 45)), ColorSequenceKeypoint.new(0.45, Color3.fromRGB(235, 95, 20)), ColorSequenceKeypoint.new(1, Color3.fromRGB(135, 45, 10)) }), Size = NumberSequence.new(2.05), Rate = 360, Speed = NumberRange.new(8, 15), Lifetime = NumberRange.new(6, 10), EmissionDirection = Enum.NormalId.Bottom, Rotation = NumberRange.new(0, 360), RotSpeed = NumberRange.new(-220, 220), Transparency = NumberSequence.new(0), Acceleration = Vector3.new(18, -8, 6), SpreadAngle = Vector2.new(38, 38), LightEmission = 0.6 }
},
["Cherry Blossom (Sakura)"] = {
Lighting = { FogColor = Color3.fromRGB(255, 200, 220), FogEnd = 600, OutdoorAmbient = Color3.fromRGB(255, 180, 200), ClockTime = 9 },
CC = { TintColor = Color3.fromRGB(255, 230, 240), Saturation = 0.3 },
Particle = { Texture = "rbxasset://textures/particles/sparkles_main.dds", AnchorSize = Vector3.new(160, 1, 160), CameraOffset = Vector3.new(0, 25, -18), Squash = NumberSequence.new(1.2), Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 220, 235)), ColorSequenceKeypoint.new(0.55, Color3.fromRGB(255, 165, 205)), ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 120, 180)) }), Size = NumberSequence.new(1.25), Rate = 190, Speed = NumberRange.new(5, 10), Lifetime = NumberRange.new(7, 10), EmissionDirection = Enum.NormalId.Bottom, Rotation = NumberRange.new(0, 360), RotSpeed = NumberRange.new(-170, 170), Transparency = NumberSequence.new(0), Acceleration = Vector3.new(14, -5, 5), SpreadAngle = Vector2.new(32, 32), LightEmission = 0.55 }
},
["Sunset (Golden Hour)"] = {
Lighting = { FogColor = Color3.fromRGB(255, 120, 50), FogEnd = 1200, OutdoorAmbient = Color3.fromRGB(200, 100, 50), ClockTime = 17.5, Brightness = 1.5 },
CC = { TintColor = Color3.fromRGB(255, 200, 150), Contrast = 0.2, Saturation = 0.4 }
},
["Blood Moon (Spooky)"] = {
Lighting = { FogColor = Color3.fromRGB(150, 10, 10), FogEnd = 500, OutdoorAmbient = Color3.fromRGB(80, 0, 0), ClockTime = 0, Brightness = 0.3 },
CC = { TintColor = Color3.fromRGB(255, 50, 50), Contrast = 0.4, Saturation = 0.5 },
Atmosphere = { Density = 0.35, Color = Color3.fromRGB(255, 0, 0), Decay = Color3.fromRGB(100, 0, 0), Haze = 5, Glare = 0 }
},
["Toxic Wasteland"] = {
Lighting = { FogColor = Color3.fromRGB(80, 150, 50), FogEnd = 250, OutdoorAmbient = Color3.fromRGB(50, 120, 40), ClockTime = 12, Brightness = 1 },
CC = { TintColor = Color3.fromRGB(150, 255, 150), Contrast = 0.1, Saturation = 0.3 },
Particle = { Texture = "rbxasset://textures/particles/sparkles_main.dds", Color = ColorSequence.new(Color3.fromRGB(100, 255, 50)), Size = NumberSequence.new(0.8), Rate = 200, Speed = NumberRange.new(50, 60), Lifetime = NumberRange.new(2, 3), EmissionDirection = Enum.NormalId.Bottom, Transparency = NumberSequence.new(0.5) }
},
["Vaporwave (Synthwave)"] = {
Lighting = { FogColor = Color3.fromRGB(200, 50, 255), FogEnd = 500, OutdoorAmbient = Color3.fromRGB(150, 0, 200), ClockTime = 20, Brightness = 1 },
CC = { TintColor = Color3.fromRGB(255, 100, 255), Contrast = 0.3, Saturation = 0.5 }
},
["Midnight (Pitch Black)"] = {
Lighting = { FogColor = Color3.fromRGB(0, 0, 0), FogEnd = 100, OutdoorAmbient = Color3.fromRGB(0, 0, 0), Brightness = 0, ClockTime = 0 },
CC = { TintColor = Color3.fromRGB(50, 50, 50), Contrast = 0.5, Saturation = -0.8 }
}
}
function VD_ApplyWeather(themeName)
local theme = KYS_WeatherPresets[themeName]
if not theme then theme = KYS_WeatherPresets["Default"] end
-- Cleanup old sky, cc, atm
if getgenv().VD_CurrentSky and getgenv().VD_CurrentSky.Parent then getgenv().VD_CurrentSky:Destroy() end
getgenv().VD_CurrentSky = nil
if getgenv().VD_WeatherCC and getgenv().VD_WeatherCC.Parent then getgenv().VD_WeatherCC:Destroy() end
getgenv().VD_WeatherCC = nil
if getgenv().VD_WeatherAtmosphere and getgenv().VD_WeatherAtmosphere.Parent then getgenv().VD_WeatherAtmosphere:Destroy() end
getgenv().VD_WeatherAtmosphere = nil
-- Apply Atmosphere
if theme.Atmosphere then
local atm = Instance.new("Atmosphere")
atm.Name = "VD_WeatherAtmosphere"
for k, v in pairs(theme.Atmosphere) do pcall(function() atm[k] = v end) end
atm.Parent = Lighting
getgenv().VD_WeatherAtmosphere = atm
end
-- Apply ColorCorrection
if theme.CC then
local cc = Instance.new("ColorCorrectionEffect")
cc.Name = "VD_WeatherCC"
for k, v in pairs(theme.CC) do pcall(function() cc[k] = v end) end
cc.Parent = Lighting
getgenv().VD_WeatherCC = cc
end
-- Apply Lighting
if theme.Lighting then
for k, v in pairs(theme.Lighting) do
pcall(function() Lighting[k] = v end)
end
else
-- Restore original lighting if no specific lighting is set, but respect Fullbright & NoFog
if not VD.Fullbright and not VD.NO_Fog then
Lighting.Brightness = originalLighting.Brightness
Lighting.ClockTime = originalLighting.ClockTime
Lighting.FogEnd = originalLighting.FogEnd
Lighting.OutdoorAmbient = originalLighting.OutdoorAmbient
end
end
-- Re-apply Fullbright & NoFog if they are on
if VD.Fullbright then pcall(VD_SetFullbright, true) end
if VD.NO_Fog then pcall(VD_SetNoFog, true) end
-- Setup Particles
if getgenv().VD_ParticleAnchor and getgenv().VD_ParticleAnchor.Parent then
getgenv().VD_ParticleAnchor:Destroy()
end
getgenv().VD_ParticleAnchor = nil
if theme.Particle then
local anchor = Instance.new("Part")
anchor.Name = "VD_WeatherAnchor"
anchor.Transparency = 0.99 -- Almost invisible but guarantees rendering
anchor.CanCollide = false
anchor.Anchored = true
anchor.Size = theme.Particle.AnchorSize or Vector3.new(120, 1, 120)
anchor:SetAttribute("VD_CameraOffsetX", theme.Particle.CameraOffset and theme.Particle.CameraOffset.X or 0)
anchor:SetAttribute("VD_CameraOffsetY", theme.Particle.CameraOffset and theme.Particle.CameraOffset.Y or 30)
anchor:SetAttribute("VD_CameraOffsetZ", theme.Particle.CameraOffset and theme.Particle.CameraOffset.Z or 0)
local pe = Instance.new("ParticleEmitter")
pe.Name = "VD_WeatherEmitter"
-- Default important settings for Weather Emitters
pe.Enabled = true
pe.EmissionDirection = Enum.NormalId.Bottom
pe.LockedToPart = false
pe.ZOffset = 2 -- Make it render over most things
pe.LightEmission = 0.25
pe.SpreadAngle = Vector2.new(10, 10)
pcall(function() pe.Shape = Enum.ParticleEmitterShape.Box end)
pcall(function() pe.ShapeStyle = Enum.ParticleEmitterShapeStyle.Volume end)
for k, v in pairs(theme.Particle) do
if k ~= "AnchorSize" and k ~= "CameraOffset" then
pcall(function() pe[k] = v end)
end
end
pe.Parent = anchor
if themeName == "Heavy Rain (Storm)" then
local nearRain = Instance.new("ParticleEmitter")
nearRain.Name = "VD_WeatherRainNearEmitter"
nearRain.Enabled = true
nearRain.Texture = "rbxasset://textures/particles/sparkles_main.dds"
nearRain.Color = ColorSequence.new(Color3.fromRGB(230, 240, 255))
nearRain.Transparency = NumberSequence.new(0)
nearRain.Size = NumberSequence.new(1.65)
nearRain.Squash = NumberSequence.new(20)
nearRain.Rate = 1800
nearRain.Speed = NumberRange.new(70, 95)
nearRain.Lifetime = NumberRange.new(0.75, 1.05)
nearRain.EmissionDirection = Enum.NormalId.Bottom
nearRain.Acceleration = Vector3.new(-24, -90, 0)
nearRain.SpreadAngle = Vector2.new(2, 2)
nearRain.LockedToPart = false
nearRain.ZOffset = 6
nearRain.LightEmission = 1
pcall(function() nearRain.Shape = Enum.ParticleEmitterShape.Box end)
pcall(function() nearRain.ShapeStyle = Enum.ParticleEmitterShapeStyle.Volume end)
nearRain.Parent = anchor
local rainSheet = Instance.new("ParticleEmitter")
rainSheet.Name = "VD_WeatherRainSheetEmitter"
rainSheet.Enabled = true
rainSheet.Texture = "rbxasset://textures/particles/smoke_main.dds"
rainSheet.Color = ColorSequence.new(Color3.fromRGB(170, 195, 225))
rainSheet.Transparency = NumberSequence.new(0.45)
rainSheet.Size = NumberSequence.new(3.2)
rainSheet.Squash = NumberSequence.new(7)
rainSheet.Rate = 650
rainSheet.Speed = NumberRange.new(45, 65)
rainSheet.Lifetime = NumberRange.new(1.0, 1.5)
rainSheet.EmissionDirection = Enum.NormalId.Bottom
rainSheet.Acceleration = Vector3.new(-14, -55, 0)
rainSheet.SpreadAngle = Vector2.new(8, 8)
rainSheet.LockedToPart = false
rainSheet.ZOffset = 3
rainSheet.LightEmission = 0.35
pcall(function() rainSheet.Shape = Enum.ParticleEmitterShape.Box end)
pcall(function() rainSheet.ShapeStyle = Enum.ParticleEmitterShapeStyle.Volume end)
rainSheet.Parent = anchor
elseif themeName == "Autumn (Musim Gugur)" then
local bigLeaves = Instance.new("ParticleEmitter")
bigLeaves.Name = "VD_WeatherAutumnBigLeavesEmitter"
bigLeaves.Enabled = true
bigLeaves.Texture = "rbxasset://textures/particles/sparkles_main.dds"
bigLeaves.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 205, 55)),
ColorSequenceKeypoint.new(0.35, Color3.fromRGB(230, 95, 25)),
ColorSequenceKeypoint.new(0.7, Color3.fromRGB(165, 65, 20)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(110, 40, 8))
})
bigLeaves.Transparency = NumberSequence.new(0)
bigLeaves.Size = NumberSequence.new({
NumberSequenceKeypoint.new(0, 2.4),
NumberSequenceKeypoint.new(0.5, 3.1),
NumberSequenceKeypoint.new(1, 1.8)
})
bigLeaves.Squash = NumberSequence.new(4.5)
bigLeaves.Rate = 150
bigLeaves.Speed = NumberRange.new(5, 10)
bigLeaves.Lifetime = NumberRange.new(8, 12)
bigLeaves.EmissionDirection = Enum.NormalId.Bottom
bigLeaves.Rotation = NumberRange.new(0, 360)
bigLeaves.RotSpeed = NumberRange.new(-280, 280)
bigLeaves.Acceleration = Vector3.new(24, -5, 10)
bigLeaves.SpreadAngle = Vector2.new(45, 45)
bigLeaves.LockedToPart = false
bigLeaves.ZOffset = 5
bigLeaves.LightEmission = 0.65
pcall(function() bigLeaves.Shape = Enum.ParticleEmitterShape.Box end)
pcall(function() bigLeaves.ShapeStyle = Enum.ParticleEmitterShapeStyle.Volume end)
bigLeaves.Parent = anchor
end
anchor.Parent = workspace
getgenv().VD_ParticleAnchor = anchor
-- FORCE PRELOAD FOR MOBILE CLIENTS
if theme.Particle.Texture then
task.spawn(function()
pcall(function()
game:GetService("ContentProvider"):PreloadAsync({pe})
end)
end)
end
-- Initial position
pcall(VD_UpdateWeatherAnchor)
end
end
function VD_UpdateWeatherAnchor()
local anchor = getgenv().VD_ParticleAnchor
if not anchor then return end
-- Keep the emitter in Workspace; ParticleEmitters under CurrentCamera can be culled on some clients.
if anchor.Parent ~= workspace then
pcall(function() anchor.Parent = workspace end)
end
local camera = workspace.CurrentCamera
if camera then
local offset = Vector3.new(
anchor:GetAttribute("VD_CameraOffsetX") or 0,
anchor:GetAttribute("VD_CameraOffsetY") or 30,
anchor:GetAttribute("VD_CameraOffsetZ") or 0
)
local worldPos = camera.CFrame.Position
+ camera.CFrame.RightVector * offset.X
+ Vector3.new(0, offset.Y, 0)
+ camera.CFrame.LookVector * math.abs(offset.Z)
anchor.CFrame = CFrame.new(worldPos)
return
end
local char = LocalPlayer.Character
if char and char:FindFirstChild("Head") then
local head = char.Head
anchor.CFrame = CFrame.new(head.Position + Vector3.new(0, 30, 0))
end
end
-- =====================================================
-- CHARACTER REFS
-- =====================================================
-- Character, Humanoid, and Root are declared at the top of __KysHub_Init_Main__
function updateChar(char)
Character = char or LocalPlayer.Character
if Character then
task.spawn(function()
Humanoid = Character:WaitForChild("Humanoid", 5)
Root = Character:WaitForChild("HumanoidRootPart", 5)
end)
else
Humanoid, Root = nil, nil
end
end
updateChar()
LocalPlayer.CharacterAdded:Connect(updateChar)
LocalPlayer.CharacterRemoving:Connect(function(char)
if char == Character or char == LocalPlayer.Character then
Character, Humanoid, Root = nil, nil, nil
end
end)
-- =====================================================
-- HELPERS: TEAM / COLORS
-- =====================================================
local TeamColor = Color3.fromRGB(0, 255, 0)
local EnemyColor = Color3.fromRGB(255, 0, 0)
function isTeammate(player)
return LocalPlayer.Team and player.Team and player.Team == LocalPlayer.Team
end
function getPlayerColor(player)
return isTeammate(player) and TeamColor or EnemyColor
end
-- =====================================================
-- CENTRALIZED METAMETHOD HOOK (__namecall)
-- =====================================================
local KYS_WorldReg
getgenv().KYS_oldNamecall = nil
function setupAntiFail()
if getgenv().KYS_AntiFailHooked then return end
getgenv().KYS_AntiFailHooked = true
task.spawn(function()
local ok, err = pcall(function()
local Remotes = ReplicatedStorage:WaitForChild("Remotes", 10)
local Events = ReplicatedStorage:WaitForChild("Events", 10)
if not Remotes then
warn("AntiFail: Remotes not found")
return
end
-- PENTING: Cache getgenv() sekali saja sebagai upvalue lokal.
-- Memanggil getgenv() di dalam __namecall hook bisa trigger namecall lagi
-- → infinite recursion → stack overflow → force close.
local _genv = getgenv()
_genv.KYS_oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
local method = getnamecallmethod()
if VD.AntiFallDamage and method == "FireServer" then
local ok, name = pcall(function() return self.Name:lower() end)
if ok and (name:find("falldamage") or name:find("fall") or name:find("ragdollfall")) then
return
end
end
if VD.KILLER_InfFrenzy and method == "FireServer" then
local ok, name = pcall(function() return self.Name end)
if ok and (name == "Deactivatefromclient" or name == "PowerDoneDeactivating") then
return
end
end
if VD.KILLER_SilentAimFlask and method == "FireServer" then
local ok, name = pcall(function() return self.Name end)
if ok and name == "ThrowFlask" then
local args = {...}
local closest = nil
local minDst = math.huge
local lp = game:GetService("Players").LocalPlayer
local myPos = lp.Character and lp.Character:FindFirstChild("HumanoidRootPart") and lp.Character.HumanoidRootPart.Position
if myPos then
for _, v in pairs(game:GetService("Players"):GetPlayers()) do
if v ~= lp and v.Character and v.Character:FindFirstChild("HumanoidRootPart") then
if not v.Character:GetAttribute("IsKiller") then
local dst = (v.Character.HumanoidRootPart.Position - myPos).Magnitude
if dst < minDst then
minDst = dst
closest = v
end
end
end
end
end
if closest then
local targetPos = closest.Character.HumanoidRootPart.Position
-- args[1] = LookVector, args[2] = OriginPosition
if args[2] and typeof(args[2]) == "Vector3" then
args[1] = (targetPos - args[2]).Unit
end
setnamecallmethod(method)
return _genv.KYS_oldNamecall(self, unpack(args))
end
end
end
if method == "FireServer" and not checkcaller() then
local flashRemote = _genv.KYS_FlashlightActivateRemote
if flashRemote and self == flashRemote and _genv.KYS_SetFlashlightAimActive then
local args = { ... }
pcall(_genv.KYS_SetFlashlightAimActive, args[2] == true, args[1])
end
end
if _genv.KYS_oldNamecall then
return _genv.KYS_oldNamecall(self, ...)
end
end)
print("AntiFail: hooked")
end)
if not ok then warn("AntiFail setup failed:", err) end
end)
end
setupAntiFail()
-- =====================================================
-- FIRST PERSON CAMERA (Survivor)
-- =====================================================
getgenv().KYS_fpWasSet = false
getgenv().KYS_fpOriginal = nil
function RestoreFirstPersonCamera()
if not getgenv().KYS_fpWasSet then return end
getgenv().KYS_fpWasSet = false
pcall(function()
if getgenv().KYS_fpOriginal then
LocalPlayer.CameraMode = getgenv().KYS_fpOriginal.CameraMode or Enum.CameraMode.Classic
LocalPlayer.CameraMaxZoomDistance = getgenv().KYS_fpOriginal.CameraMaxZoomDistance or 128
LocalPlayer.CameraMinZoomDistance = getgenv().KYS_fpOriginal.CameraMinZoomDistance or 0.5
else
LocalPlayer.CameraMode = Enum.CameraMode.Classic
LocalPlayer.CameraMaxZoomDistance = 128
end
end)
local char = LocalPlayer.Character
if char then
local head = char:FindFirstChild("Head")
if head then head.LocalTransparencyModifier = 0 end
for _, obj in ipairs(char:GetChildren()) do
if obj:IsA("Accessory") then
local handle = obj:FindFirstChild("Handle")
if handle then handle.LocalTransparencyModifier = 0 end
end
end
end
getgenv().KYS_fpOriginal = nil
end
RunService.RenderStepped:Connect(function()
pcall(function()
if VD.SURV_FirstPerson then
local isSurvivor = LocalPlayer.Team and LocalPlayer.Team.Name == "Survivors"
if isSurvivor then
if not getgenv().KYS_fpWasSet then
getgenv().KYS_fpOriginal = {
CameraMode = LocalPlayer.CameraMode,
CameraMaxZoomDistance = LocalPlayer.CameraMaxZoomDistance,
CameraMinZoomDistance = LocalPlayer.CameraMinZoomDistance,
}
end
-- Paksa LockFirstPerson hanya saat toggle aktif agar game tidak bisa override
if LocalPlayer.CameraMode ~= Enum.CameraMode.LockFirstPerson then
LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson
end
if LocalPlayer.CameraMaxZoomDistance ~= 0 then
LocalPlayer.CameraMaxZoomDistance = 0
end
-- Sembunyikan kepala & aksesoris wajah agar tidak menghalangi pandangan
-- (LocalTransparencyModifier hanya berlaku untuk kita sendiri, orang lain tetap melihat kepala kita)
local char = LocalPlayer.Character
if char then
local head = char:FindFirstChild("Head")
if head then
head.LocalTransparencyModifier = 1
end
-- Sembunyikan juga aksesoris yang menempel di kepala (hat, face, hair)
for _, obj in ipairs(char:GetChildren()) do
if obj:IsA("Accessory") then
local handle = obj:FindFirstChild("Handle")
if handle then
handle.LocalTransparencyModifier = 1
end
end
end
end
getgenv().KYS_fpWasSet = true
elseif getgenv().KYS_fpWasSet then
RestoreFirstPersonCamera()
end
elseif getgenv().KYS_fpWasSet then
RestoreFirstPersonCamera()
end
end)
end)
-- =====================================================
-- VISUAL HIGHLIGHT ESP V2 (Player + World)
-- Stabil, anti double nametag, anti duplicate highlight, dan safe re-execute.
-- Kontrol ditambahkan ke tab Visual lewat getgenv().KYS_AddVisualESPControls.
-- =====================================================
do
if getgenv().KYS_VD_VisualESP_Cleanup then
pcall(getgenv().KYS_VD_VisualESP_Cleanup)
end
local LP = LocalPlayer
local KYS_Dead = false
local KYS_ControlsAdded = false
local KYS_ESPState = {
PlayerMasterESP = false,
WorldMasterESP = false,
ESPFillTransparency = 0.95,
ESPOutlineTransparency = 0.3,
ESPTextSize = 12,
SurvivorESP = false,
KillerESP = false,
SpectatorESP = false,
Nametags = false,
DistanceESP = false,
SurvivorItemsESP = false,
SurvivorColor = Color3.fromRGB(0, 255, 0),
KillerColor = Color3.fromRGB(255, 0, 0),
SpectatorColor = Color3.fromRGB(255, 255, 255),
GeneratorESP = false,
HookESP = false,
GateESP = false,
WindowESP = false,
PalletESP = false,
SCPZombieESP = false,
WorldNametags = false,
WorldDistanceESP = false,
GeneratorColor = Color3.fromRGB(0, 170, 255),
HookColor = Color3.fromRGB(255, 0, 0),
GateColor = Color3.fromRGB(255, 225, 0),
WindowColor = Color3.fromRGB(255, 255, 255),
PalletColor = Color3.fromRGB(255, 140, 0),
SCPZombieColor = Color3.fromRGB(128, 0, 128),
}
getgenv().KYS_VD_VisualESP_State = KYS_ESPState
KYS_WorldReg = {
Generator = {},
Hook = {},
Gate = {},
Window = {},
Palletwrong = {},
SCPZombie = {},
}
local KYS_MapAdd, KYS_MapRem = {}, {}
local KYS_PlayerConns = {}
local KYS_Connections = {}
local KYS_PalletState = setmetatable({}, { __mode = "k" })
local KYS_WindowState = setmetatable({}, { __mode = "k" })
local KYS_InstanceIds = setmetatable({}, { __mode = "k" })
local KYS_KystId = 0
local KYS_PlayerLoopThread = nil
local KYS_WorldLoopThread = nil
local KYS_ESPFolder = nil
local KYS_DisplayNames = {
["Motion Tracker"] = true,
["Gate"] = true,
["Flashlight"] = true,
["Bandage"] = true,
["Parrying Dagger"] = true,
["Adrenaline Shot"] = true,
["Twist of Fate"] = true,
["Shadow Clone"] = true,
["Holy Water"] = true,
["WaxBound Candle"] = true,
["Riot Shield"] = true,
["Emperor"] = true,
["AWP"] = true,
}
local function KYS_Alive(inst)
if not inst then return false end
local ok, parent = pcall(function() return inst.Parent end)
return ok and parent ~= nil
end
local function KYS_Clamp(n, lo, hi)
n = tonumber(n) or lo
if n < lo then return lo end
if n > hi then return hi end
return n
end
local function KYS_PlayerKey(player)
local id = player and player.UserId
if id and id ~= 0 then return tostring(id) end
return tostring(player and player.Name or "Unknown")
end
local function KYS_EspId(inst)
if not inst then return "nil" end
local id = KYS_InstanceIds[inst]
if id then return id end
KYS_KystId = KYS_KystId + 1
id = tostring(KYS_KystId)
KYS_InstanceIds[inst] = id
return id
end
local function KYS_GetESPParent()
local okCore, core = pcall(function() return game:GetService("CoreGui") end)
if okCore and core then return core end
if gethui then
local okHui, hui = pcall(gethui)
if okHui and hui then return hui end
end
local playerGui = LP and LP:FindFirstChildOfClass("PlayerGui")
if playerGui then return playerGui end
return Workspace
end
local function KYS_GetESPFolder()
if KYS_ESPFolder and KYS_ESPFolder.Parent then
return KYS_ESPFolder
end
local parent = KYS_GetESPParent()
local old = parent:FindFirstChild("KysHub_VisualESP") or parent:FindFirstChild("ZiaanHub_ESP")
if old then old:Destroy() end
local folder = Instance.new("Folder")
folder.Name = "KysHub_VisualESP"
folder.Parent = parent
KYS_ESPFolder = folder
return folder
end
local function KYS_ClearPrefix(prefix, keepName)
local folder = KYS_GetESPFolder()
local keptExact = false
for _, child in ipairs(folder:GetChildren()) do
if child.Name:sub(1, #prefix) == prefix then
if child.Name == keepName and not keptExact then
keptExact = true
else
child:Destroy()
end
end
end
end
local function KYS_SafeNotify(title, content, duration)
pcall(function()
if Window and Window.Notify then
Window:Notify({
Title = title,
Content = content,
Duration = duration or 2,
Icon = "lucide:info",
})
end
end)
end
local function KYS_ValidPart(part)
return part and KYS_Alive(part) and part:IsA("BasePart")
end
local function KYS_FirstBasePart(inst)
if not KYS_Alive(inst) then return nil end
if inst:IsA("BasePart") then return inst end
if inst:IsA("Model") then
if inst.PrimaryPart and inst.PrimaryPart:IsA("BasePart") and KYS_Alive(inst.PrimaryPart) then
return inst.PrimaryPart
end
local part = inst:FindFirstChildWhichIsA("BasePart", true)
if KYS_ValidPart(part) then return part end
end
if inst:IsA("Tool") then
local handle = inst:FindFirstChild("Handle") or inst:FindFirstChildWhichIsA("BasePart")
if KYS_ValidPart(handle) then return handle end
end
return nil
end
local function KYS_GetRole(player)
local teamName = player.Team and player.Team.Name and player.Team.Name:lower() or ""
if teamName:find("killer") then return "Killer" end
if teamName:find("survivor") then return "Survivor" end
if teamName:find("spect") then return "Spectator" end
return "Survivor"
end
local function KYS_PlayerRoleEnabled(player)
local role = KYS_GetRole(player)
if role == "Killer" then return KYS_ESPState.KillerESP end
if role == "Spectator" then return KYS_ESPState.SpectatorESP end
return KYS_ESPState.SurvivorESP
end
local function KYS_PlayerColor(player)
local role = KYS_GetRole(player)
if role == "Killer" then return KYS_ESPState.KillerColor end
if role == "Spectator" then return KYS_ESPState.SpectatorColor end
return KYS_ESPState.SurvivorColor
end
getgenv().KYS_VD_VisualESP_HasPlayerText = function(player)
if not player or player == LP then return false end
return KYS_ESPState.PlayerMasterESP
and KYS_PlayerRoleEnabled(player)
and (KYS_ESPState.Nametags or KYS_ESPState.DistanceESP)
end
local function KYS_EnsureHighlight(name, adornee, color, isPlayer)
if not (adornee and KYS_Alive(adornee)) then return nil end
local folder = KYS_GetESPFolder()
KYS_ClearPrefix(name, name)
local hl = folder:FindFirstChild(name)
if not hl then
hl = Instance.new("Highlight")
hl.Name = name
hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
hl.Parent = folder
end
hl.Adornee = adornee
hl.FillColor = color
hl.OutlineColor = color
if isPlayer then
hl.FillTransparency = KYS_ESPState.ESPFillTransparency
hl.OutlineTransparency = KYS_ESPState.ESPOutlineTransparency
else
hl.FillTransparency = 0.98
hl.OutlineTransparency = 0.5
end
hl.Enabled = true
return hl
end
local function KYS_DestroyChild(name)
local folder = KYS_GetESPFolder()
local child = folder:FindFirstChild(name)
if child then child:Destroy() end
end
local function KYS_ClearPlayerESP(player)
if not player or player == LP then return end
local key = KYS_PlayerKey(player)
KYS_DestroyChild("KYS_PlayerHL_" .. key)
KYS_DestroyChild("KYS_PlayerTag_" .. key)
KYS_DestroyChild("KYS_PlayerItem_" .. key)
end
local function KYS_ClearAllPlayerESP()
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LP then
KYS_ClearPlayerESP(player)
end
end
end
local function KYS_GetSurvivorItem(player)
local character = player.Character
if not character then return nil end
for _, obj in ipairs(character:GetDescendants()) do
if obj:IsA("Tool") or obj:IsA("Accessory") or obj:IsA("Model") then
if KYS_DisplayNames[obj.Name] then
return obj.Name
end
end
end
return nil
end
local function KYS_GetItemImageId(itemName)
local itemsFolder = ReplicatedStorage:FindFirstChild("Items")
if not itemsFolder then return nil end
local itemObj = itemsFolder:FindFirstChild(itemName)
if not itemObj then return nil end
if itemObj:IsA("Decal") or itemObj:IsA("Texture") then return itemObj.Texture end
local texture = itemObj:FindFirstChildWhichIsA("Decal", true) or itemObj:FindFirstChildWhichIsA("Texture", true)
if texture then return texture.Texture end
local namedTexture = itemObj:FindFirstChild("Texture", true)
if namedTexture and (namedTexture:IsA("Decal") or namedTexture:IsA("Texture")) then
return namedTexture.Texture
end
return nil
end
local function KYS_SetBillboardLine(parent, index, count, data)
local label = parent:FindFirstChild("Line" .. index)
if not label then
label = Instance.new("TextLabel")
label.Name = "Line" .. index
label.BackgroundTransparency = 1
label.BorderSizePixel = 0
label.Font = Enum.Font.Gotham
label.TextStrokeTransparency = 0.65
label.TextStrokeColor3 = Color3.new(0, 0, 0)
label.Parent = parent
end
label.Size = UDim2.new(1, 0, 1 / count, 0)
label.Position = UDim2.new(0, 0, (index - 1) / count, 0)
label.TextSize = KYS_ESPState.ESPTextSize
label.TextColor3 = data.Color
label.Text = data.Text
end
local function KYS_PruneBillboardLines(parent, count)
for _, child in ipairs(parent:GetChildren()) do
if child:IsA("TextLabel") then
local index = tonumber(child.Name:match("%d+"))
if index and index > count then
child:Destroy()
end
end
end
end
local function KYS_UpdatePlayerTag(player, character, head, color)
local key = KYS_PlayerKey(player)
local tagName = "KYS_PlayerTag_" .. key
local folder = KYS_GetESPFolder()
KYS_ClearPrefix("KYS_PlayerTag_" .. key, tagName)
if not KYS_ValidPart(head) then
KYS_DestroyChild(tagName)
return
end
local lines = {}
local root = LP.Character and LP.Character:FindFirstChild("HumanoidRootPart")
local targetRoot = character and character:FindFirstChild("HumanoidRootPart")
local distanceText = ""
if KYS_ESPState.DistanceESP and root and targetRoot then
distanceText = "[" .. tostring(math.floor((root.Position - targetRoot.Position).Magnitude)) .. "m]"
end
local nameText = KYS_ESPState.Nametags and player.Name or ""
local mainLine = ""
if nameText ~= "" and distanceText ~= "" then
mainLine = nameText .. " " .. distanceText
elseif nameText ~= "" then
mainLine = nameText
elseif distanceText ~= "" then
mainLine = distanceText
end
if mainLine ~= "" then
table.insert(lines, { Text = mainLine, Color = color })
end
if #lines == 0 then
KYS_DestroyChild(tagName)
return
end
local tag = folder:FindFirstChild(tagName)
if not tag then
tag = Instance.new("BillboardGui")
tag.Name = tagName
tag.AlwaysOnTop = true
tag.LightInfluence = 0
tag.MaxDistance = 0
tag.Parent = folder
end
tag.Adornee = head
tag.Enabled = true
tag.Size = UDim2.new(0, 220, 0, #lines * 20)
tag.StudsOffset = Vector3.new(0, 2.65, 0)
for i, data in ipairs(lines) do
KYS_SetBillboardLine(tag, i, #lines, data)
end
KYS_PruneBillboardLines(tag, #lines)
end
local function KYS_UpdatePlayerItemIcon(player, torso)
local key = KYS_PlayerKey(player)
local iconName = "KYS_PlayerItem_" .. key
local folder = KYS_GetESPFolder()
KYS_ClearPrefix("KYS_PlayerItem_" .. key, iconName)
if not KYS_ValidPart(torso) then
KYS_DestroyChild(iconName)
return
end
local itemName = KYS_GetSurvivorItem(player)
local imageId = itemName and KYS_GetItemImageId(itemName) or nil
if not imageId then
KYS_DestroyChild(iconName)
return
end
local icon = folder:FindFirstChild(iconName)
if not icon then
icon = Instance.new("BillboardGui")
icon.Name = iconName
icon.AlwaysOnTop = true
icon.LightInfluence = 0
icon.MaxDistance = 0
icon.Size = UDim2.fromOffset(20, 20)
icon.StudsOffset = Vector3.new(0, 0, -1.6)
icon.Parent = folder
local image = Instance.new("ImageLabel")
image.Name = "ImageLabel"
image.BackgroundTransparency = 1
image.Size = UDim2.fromScale(1, 1)
image.Parent = icon
end
icon.Adornee = torso
icon.Enabled = true
local image = icon:FindFirstChild("ImageLabel")
if image then image.Image = imageId end
end
local KYS_ApplyPlayerESP
KYS_ApplyPlayerESP = function(player)
if KYS_Dead or not player or player == LP then return end
local character = player.Character
if not (character and KYS_Alive(character)) then
KYS_ClearPlayerESP(player)
return
end
local key = KYS_PlayerKey(player)
local enabled = KYS_ESPState.PlayerMasterESP and KYS_PlayerRoleEnabled(player)
if not enabled then
KYS_ClearPlayerESP(player)
return
end
local color = KYS_PlayerColor(player)
local head = character:FindFirstChild("Head")
local torso = character:FindFirstChild("HumanoidRootPart") or character:FindFirstChild("UpperTorso") or character:FindFirstChild("Torso")
KYS_EnsureHighlight("KYS_PlayerHL_" .. key, character, color, true)
KYS_UpdatePlayerTag(player, character, head, color)
if KYS_GetRole(player) == "Survivor" and KYS_ESPState.SurvivorItemsESP then
KYS_UpdatePlayerItemIcon(player, torso)
else
KYS_DestroyChild("KYS_PlayerItem_" .. key)
end
end
local function KYS_RefreshAllPlayers()
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LP then
pcall(KYS_ApplyPlayerESP, player)
end
end
end
local function KYS_StartPlayerLoop()
if KYS_PlayerLoopThread then return end
KYS_PlayerLoopThread = task.spawn(function()
while not KYS_Dead and KYS_ESPState.PlayerMasterESP do
KYS_RefreshAllPlayers()
task.wait(0.25)
end
KYS_PlayerLoopThread = nil
end)
end
local function KYS_WatchPlayer(player)
if player == LP then return end
if KYS_PlayerConns[player] then
for _, conn in ipairs(KYS_PlayerConns[player]) do
if conn then pcall(function() conn:Disconnect() end) end
end
end
KYS_PlayerConns[player] = {}
table.insert(KYS_PlayerConns[player], player.CharacterAdded:Connect(function(char)
KYS_ClearPlayerESP(player)
task.delay(0.15, function()
if not KYS_Dead then pcall(KYS_ApplyPlayerESP, player) end
end)
end))
table.insert(KYS_PlayerConns[player], player.CharacterRemoving:Connect(function()
KYS_ClearPlayerESP(player)
end))
table.insert(KYS_PlayerConns[player], player:GetPropertyChangedSignal("Team"):Connect(function()
KYS_ClearPlayerESP(player)
pcall(KYS_ApplyPlayerESP, player)
end))
if player.Character then
pcall(KYS_ApplyPlayerESP, player)
end
end
local function KYS_UnwatchPlayer(player)
KYS_ClearPlayerESP(player)
if KYS_PlayerConns[player] then
for _, conn in ipairs(KYS_PlayerConns[player]) do
if conn then pcall(function() conn:Disconnect() end) end
end
end
KYS_PlayerConns[player] = nil
end
local function KYS_PickWorldPart(model, cat)
if not (model and KYS_Alive(model)) then return nil end
if cat == "Generator" then
local hitbox = model:FindFirstChild("HitBox", true) or model:FindFirstChild("GeneratorPoint", true)
if KYS_ValidPart(hitbox) then return hitbox end
elseif cat == "Palletwrong" then
local candidates = {
model:FindFirstChild("HumanoidRootPart", true),
model:FindFirstChild("PrimaryPartPallet", true),
model:FindFirstChild("Primary1", true),
model:FindFirstChild("Primary2", true),
model:FindFirstChild("PalletPoint", true),
model:FindFirstChild("PalletPointSlide", true),
}
for _, part in ipairs(candidates) do
if KYS_ValidPart(part) then return part end
end
elseif cat == "Window" then
local vault = model:FindFirstChild("VaultPoint", true) or model:FindFirstChild("VaultTrigger", true)
if KYS_ValidPart(vault) then return vault end
elseif cat == "SCPZombie" then
local root = model:FindFirstChild("HumanoidRootPart", true)
if KYS_ValidPart(root) then return root end
local torso = model:FindFirstChild("UpperTorso", true) or model:FindFirstChild("Torso", true)
if KYS_ValidPart(torso) then return torso end
return nil
end
return KYS_FirstBasePart(model)
end
local function KYS_GeneratorLabel(model)
local pct = tonumber(model:GetAttribute("RepairProgress")) or 0
if pct >= 0 and pct <= 1.001 then pct = pct * 100 end
pct = KYS_Clamp(pct, 0, 100)
local repairers = tonumber(model:GetAttribute("PlayersRepairingCount")) or 0
local paused = model:GetAttribute("ProgressPaused") == true
local kickcount = tonumber(model:GetAttribute("kickcount")) or 0
local abyss50 = model:GetAttribute("Abyss50Triggered") == true
local parts = { "Gen " .. tostring(math.floor(pct + 0.5)) .. "%" }
if repairers > 0 then table.insert(parts, "(" .. repairers .. "p)") end
if paused then table.insert(parts, "Pause") end
if abyss50 then table.insert(parts, "Warn") end
if kickcount > 0 then table.insert(parts, "K:" .. kickcount) end
local hue = KYS_Clamp((pct / 100) * 0.33, 0, 0.33)
return table.concat(parts, " "), Color3.fromHSV(hue, 1, 1)
end
local function KYS_HasBasePart(model)
if not (model and KYS_Alive(model)) then return false end
return model:FindFirstChildWhichIsA("BasePart", true) ~= nil
end
local function KYS_IsPalletGone(model)
if not KYS_Alive(model) then return true end
if not model:IsDescendantOf(Workspace) then return true end
if KYS_PalletState[model] == "DEST" then return true end
local ok, destroyed = pcall(function() return model:GetAttribute("Destroyed") end)
if ok and destroyed == true then return true end
return not KYS_HasBasePart(model)
end
local function KYS_WorldKey(cat, model)
return "KYS_World_" .. cat .. "_" .. KYS_EspId(model)
end
local function KYS_ClearWorldVisual(cat, model)
if not model then return end
KYS_DestroyChild(KYS_WorldKey(cat, model) .. "_HL")
KYS_DestroyChild(KYS_WorldKey(cat, model) .. "_Tag")
end
local function KYS_RemoveWorldEntry(cat, model)
if not KYS_WorldReg[cat] or not KYS_WorldReg[cat][model] then return end
KYS_ClearWorldVisual(cat, model)
KYS_WorldReg[cat][model] = nil
end
local function KYS_EnsureWorldEntry(cat, model)
if not KYS_Alive(model) or not KYS_WorldReg[cat] or KYS_WorldReg[cat][model] then return end
if cat == "Palletwrong" and KYS_IsPalletGone(model) then return end
local part = KYS_PickWorldPart(model, cat)
if not KYS_ValidPart(part) then return end
KYS_WorldReg[cat][model] = { part = part }
end
local function KYS_RegisterWorldDescendant(obj)
if not KYS_Alive(obj) then return end
local validCats = { Generator = true, Hook = true, Gate = true, Window = true, Palletwrong = true }
if obj:IsA("Model") then
if validCats[obj.Name] then
KYS_EnsureWorldEntry(obj.Name, obj)
return
end
local lower = obj.Name:lower()
if lower:find("scp") or lower:find("zombie") then
KYS_EnsureWorldEntry("SCPZombie", obj)
end
return
end
if obj:IsA("BasePart") then
local parent = obj.Parent
while parent and parent ~= Workspace do
if parent:IsA("Model") then
if validCats[parent.Name] then
KYS_EnsureWorldEntry(parent.Name, parent)
return
end
local lower = parent.Name:lower()
if lower:find("scp") or lower:find("zombie") then
KYS_EnsureWorldEntry("SCPZombie", parent)
return
end
end
parent = parent.Parent
end
end
end
local function KYS_UnregisterWorldDescendant(obj)
if not obj then return end
local validCats = { Generator = true, Hook = true, Gate = true, Window = true, Palletwrong = true }
if obj:IsA("Model") then
if validCats[obj.Name] then
KYS_RemoveWorldEntry(obj.Name, obj)
return
end
local lower = obj.Name:lower()
if lower:find("scp") or lower:find("zombie") then
KYS_RemoveWorldEntry("SCPZombie", obj)
end
return
end
if obj:IsA("BasePart") then
for cat, models in pairs(KYS_WorldReg) do
for model, entry in pairs(models) do
if entry.part == obj then
KYS_RemoveWorldEntry(cat, model)
end
end
end
end
end
local function KYS_AttachESPRoot(root)
if not root or KYS_MapAdd[root] then return end
KYS_MapAdd[root] = root.DescendantAdded:Connect(KYS_RegisterWorldDescendant)
KYS_MapRem[root] = root.DescendantRemoving:Connect(KYS_UnregisterWorldDescendant)
for _, descendant in ipairs(root:GetDescendants()) do
KYS_RegisterWorldDescendant(descendant)
end
end
local function KYS_RefreshESPRoots()
for _, conn in pairs(KYS_MapAdd) do
if conn then pcall(function() conn:Disconnect() end) end
end
for _, conn in pairs(KYS_MapRem) do
if conn then pcall(function() conn:Disconnect() end) end
end
KYS_MapAdd, KYS_MapRem = {}, {}
for cat, models in pairs(KYS_WorldReg) do
for model in pairs(models) do
KYS_ClearWorldVisual(cat, model)
end
KYS_WorldReg[cat] = {}
end
local map = Workspace:FindFirstChild("Map")
local map1 = Workspace:FindFirstChild("Map1")
if map then KYS_AttachESPRoot(map) end
if map1 then KYS_AttachESPRoot(map1) end
end
local function KYS_LabelForPallet(model)
local state = KYS_PalletState[model] or "UP"
if state == "DOWN" then return "Pallet (down)" end
if state == "DEST" then return "Pallet (destroyed)" end
if state == "SLIDE" then return "Pallet (slide)" end
return "Pallet"
end
local function KYS_LabelForWindow(model)
local state = KYS_WindowState[model] or "READY"
if state == "BUSY" then return "Window (busy)" end
return "Window"
end
local function KYS_AnyWorldEnabled()
return KYS_ESPState.WorldMasterESP and (
KYS_ESPState.GeneratorESP or
KYS_ESPState.HookESP or
KYS_ESPState.GateESP or
KYS_ESPState.WindowESP or
KYS_ESPState.PalletESP or
KYS_ESPState.SCPZombieESP
)
end
local function KYS_WorldCategoryData(cat)
if cat == "Generator" then return KYS_ESPState.GeneratorESP, KYS_ESPState.GeneratorColor end
if cat == "Hook" then return KYS_ESPState.HookESP, KYS_ESPState.HookColor end
if cat == "Gate" then return KYS_ESPState.GateESP, KYS_ESPState.GateColor end
if cat == "Window" then return KYS_ESPState.WindowESP, KYS_ESPState.WindowColor end
if cat == "Palletwrong" then return KYS_ESPState.PalletESP, KYS_ESPState.PalletColor end
if cat == "SCPZombie" then return KYS_ESPState.SCPZombieESP, KYS_ESPState.SCPZombieColor end
return false, Color3.new(1, 1, 1)
end
local function KYS_UpdateWorldTag(cat, model, part, color)
local key = KYS_WorldKey(cat, model)
local tagName = key .. "_Tag"
local folder = KYS_GetESPFolder()
KYS_ClearPrefix(tagName, tagName)
if not KYS_ValidPart(part) then
KYS_DestroyChild(tagName)
return
end
local lines = {}
local root = LP.Character and LP.Character:FindFirstChild("HumanoidRootPart")
local distanceText = ""
if KYS_ESPState.WorldDistanceESP and root then
distanceText = "[" .. tostring(math.floor((root.Position - part.Position).Magnitude)) .. "m]"
end
local nameText = ""
local labelColor = color
if KYS_ESPState.WorldNametags then
if cat == "Generator" then
local txt, genColor = KYS_GeneratorLabel(model)
nameText = txt
labelColor = genColor
elseif cat == "Palletwrong" then
nameText = KYS_LabelForPallet(model)
elseif cat == "Window" then
nameText = KYS_LabelForWindow(model)
elseif cat == "SCPZombie" then
nameText = model.Name
else
nameText = cat
end
end
local mainLine = ""
if nameText ~= "" and distanceText ~= "" then
mainLine = nameText .. " " .. distanceText
elseif nameText ~= "" then
mainLine = nameText
elseif distanceText ~= "" then
mainLine = distanceText
end
if mainLine ~= "" then
table.insert(lines, { Text = mainLine, Color = labelColor })
end
if #lines == 0 then
KYS_DestroyChild(tagName)
return
end
local tag = folder:FindFirstChild(tagName)
if not tag then
tag = Instance.new("BillboardGui")
tag.Name = tagName
tag.AlwaysOnTop = true
tag.LightInfluence = 0
tag.MaxDistance = 0
tag.Parent = folder
end
tag.Adornee = part
tag.Enabled = true
tag.Size = UDim2.new(0, 220, 0, #lines * 20)
tag.StudsOffset = Vector3.new(0, 2.5, 0)
for i, data in ipairs(lines) do
KYS_SetBillboardLine(tag, i, #lines, data)
end
KYS_PruneBillboardLines(tag, #lines)
end
local function KYS_ClearAllWorldESP()
for cat, models in pairs(KYS_WorldReg) do
for model in pairs(models) do
KYS_ClearWorldVisual(cat, model)
end
end
end
local function KYS_StartWorldLoop()
if KYS_WorldLoopThread then return end
KYS_WorldLoopThread = task.spawn(function()
while not KYS_Dead and KYS_AnyWorldEnabled() do
for cat, models in pairs(KYS_WorldReg) do
local enabled, color = KYS_WorldCategoryData(cat)
if enabled and KYS_ESPState.WorldMasterESP then
local n = 0
for model, entry in pairs(models) do
if cat == "Palletwrong" and KYS_IsPalletGone(model) then
KYS_RemoveWorldEntry(cat, model)
elseif model and KYS_Alive(model) then
local part = entry.part
if not KYS_ValidPart(part) or (model:IsA("Model") and not part:IsDescendantOf(model)) then
entry.part = KYS_PickWorldPart(model, cat)
part = entry.part
end
if KYS_ValidPart(part) then
local key = KYS_WorldKey(cat, model)
KYS_EnsureHighlight(key .. "_HL", model, color, false)
KYS_UpdateWorldTag(cat, model, part, color)
else
KYS_RemoveWorldEntry(cat, model)
end
else
KYS_RemoveWorldEntry(cat, model)
end
n = n + 1
if n % 60 == 0 then task.wait() end
end
else
for model in pairs(models) do
KYS_ClearWorldVisual(cat, model)
end
end
end
task.wait(0.25)
end
KYS_WorldLoopThread = nil
end)
end
local function KYS_Selected(selected, name)
if type(selected) ~= "table" then return false end
if selected[name] ~= nil then return selected[name] == true end
for _, value in pairs(selected) do
if value == name then return true end
end
return false
end
getgenv().KYS_AddVisualESPControls = function(VisualTabRef)
if not VisualTabRef or KYS_ControlsAdded then return end
KYS_ControlsAdded = true
local settingsSection = VisualTabRef:AddSection({
Position = "Center",
Name = "Highlight ESP Settings",
Icon = "solar:settings-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
settingsSection:AddSlider({
Name = "ESP Fill Transparency",
Flag = "KYS ESP Fill Transparency",
Min = 0,
Max = 1,
Default = KYS_ESPState.ESPFillTransparency,
Increment = 0.01,
Callback = function(value)
KYS_ESPState.ESPFillTransparency = value
KYS_RefreshAllPlayers()
end,
})
settingsSection:AddSlider({
Name = "ESP Outline Transparency",
Flag = "KYS ESP Outline Transparency",
Min = 0,
Max = 1,
Default = KYS_ESPState.ESPOutlineTransparency,
Increment = 0.01,
Callback = function(value)
KYS_ESPState.ESPOutlineTransparency = value
KYS_RefreshAllPlayers()
end,
})
settingsSection:AddSlider({
Name = "ESP Text Size",
Flag = "KYS ESP Text Size",
Min = 8,
Max = 22,
Default = KYS_ESPState.ESPTextSize,
Increment = 1,
Callback = function(value)
KYS_ESPState.ESPTextSize = value
KYS_RefreshAllPlayers()
end,
})
local playerSection = VisualTabRef:AddSection({
Position = "Center",
Name = "Player Highlight ESP",
Icon = "solar:users-group-rounded-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
playerSection:AddToggle({
Name = "Enable Player ESP",
Flag = "KYS Enable Player ESP",
Default = false,
Callback = function(state)
KYS_ESPState.PlayerMasterESP = state
if state then
KYS_StartPlayerLoop()
KYS_RefreshAllPlayers()
else
KYS_ClearAllPlayerESP()
end
end,
})
playerSection:AddDropdown({
Name = "Select Player ESP",
Flag = "KYS Select Player ESP",
Values = { "Survivor ESP", "Killer ESP", "Spectator ESP", "Survivor Items ESP" },
Multi = true,
AllowNone = true,
Default = {},
Callback = function(selected)
KYS_ESPState.SurvivorESP = KYS_Selected(selected, "Survivor ESP")
KYS_ESPState.KillerESP = KYS_Selected(selected, "Killer ESP")
KYS_ESPState.SpectatorESP = KYS_Selected(selected, "Spectator ESP")
KYS_ESPState.SurvivorItemsESP = KYS_Selected(selected, "Survivor Items ESP")
if KYS_ESPState.PlayerMasterESP then
KYS_StartPlayerLoop()
KYS_RefreshAllPlayers()
else
KYS_ClearAllPlayerESP()
end
end,
})
playerSection:AddToggle({
Name = "Player Nametags",
Flag = "KYS Player Nametags",
Default = false,
Callback = function(state)
KYS_ESPState.Nametags = state
if KYS_ESPState.PlayerMasterESP then
KYS_StartPlayerLoop()
KYS_RefreshAllPlayers()
else
KYS_ClearAllPlayerESP()
end
end,
})
playerSection:AddToggle({
Name = "Player Distance ESP",
Flag = "KYS Player Distance ESP",
Default = false,
Callback = function(state)
KYS_ESPState.DistanceESP = state
if KYS_ESPState.PlayerMasterESP then
KYS_StartPlayerLoop()
KYS_RefreshAllPlayers()
else
KYS_ClearAllPlayerESP()
end
end,
})
playerSection:AddToggle({
Name = "Survivor Killer Warning (!)",
Flag = "Survivor Killer Warning",
Default = false,
Callback = function(state)
VD.SURV_WarnKiller = state
end,
})
pcall(function() playerSection:AddDivider({ Text = "Colors" }) end)
playerSection:AddColorPicker({ Name = "Survivor Color", Flag = "KYS Survivor Color", Default = KYS_ESPState.SurvivorColor, Callback = function(color) KYS_ESPState.SurvivorColor = color; KYS_RefreshAllPlayers() end })
playerSection:AddColorPicker({ Name = "Killer Color", Flag = "KYS Killer Color", Default = KYS_ESPState.KillerColor, Callback = function(color) KYS_ESPState.KillerColor = color; KYS_RefreshAllPlayers() end })
playerSection:AddColorPicker({ Name = "Spectator Color", Flag = "KYS Spectator Color", Default = KYS_ESPState.SpectatorColor, Callback = function(color) KYS_ESPState.SpectatorColor = color; KYS_RefreshAllPlayers() end })
local worldSection = VisualTabRef:AddSection({
Position = "Center",
Name = "World Highlight ESP",
Icon = "solar:map-point-wave-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
worldSection:AddToggle({
Name = "Enable World ESP",
Flag = "KYS Enable World ESP",
Default = false,
Callback = function(state)
KYS_ESPState.WorldMasterESP = state
if state then
KYS_RefreshESPRoots()
if KYS_AnyWorldEnabled() then KYS_StartWorldLoop() end
else
KYS_ClearAllWorldESP()
end
end,
})
worldSection:AddDropdown({
Name = "Select World Objects",
Flag = "KYS Select World Objects",
Values = { "Generators", "Hooks", "Gates", "Windows", "Pallets", "SCP / Zombie" },
Multi = true,
AllowNone = true,
Default = {},
Callback = function(selected)
KYS_ESPState.GeneratorESP = KYS_Selected(selected, "Generators")
KYS_ESPState.HookESP = KYS_Selected(selected, "Hooks")
KYS_ESPState.GateESP = KYS_Selected(selected, "Gates")
KYS_ESPState.WindowESP = KYS_Selected(selected, "Windows")
KYS_ESPState.PalletESP = KYS_Selected(selected, "Pallets")
KYS_ESPState.SCPZombieESP = KYS_Selected(selected, "SCP / Zombie")
if KYS_ESPState.WorldMasterESP and KYS_AnyWorldEnabled() then
KYS_RefreshESPRoots()
KYS_StartWorldLoop()
else
KYS_ClearAllWorldESP()
end
end,
})
worldSection:AddToggle({
Name = "World Nametags",
Flag = "KYS World Nametags",
Default = false,
Callback = function(state)
KYS_ESPState.WorldNametags = state
if KYS_ESPState.WorldMasterESP and KYS_AnyWorldEnabled() then KYS_StartWorldLoop() else KYS_ClearAllWorldESP() end
end,
})
worldSection:AddToggle({
Name = "World Distance ESP",
Flag = "KYS World Distance ESP",
Default = false,
Callback = function(state)
KYS_ESPState.WorldDistanceESP = state
if KYS_ESPState.WorldMasterESP and KYS_AnyWorldEnabled() then KYS_StartWorldLoop() else KYS_ClearAllWorldESP() end
end,
})
pcall(function() worldSection:AddDivider({ Text = "Colors" }) end)
worldSection:AddColorPicker({ Name = "Generator Color", Flag = "KYS Generator Color", Default = KYS_ESPState.GeneratorColor, Callback = function(color) KYS_ESPState.GeneratorColor = color end })
worldSection:AddColorPicker({ Name = "Hook Color", Flag = "KYS Hook Color", Default = KYS_ESPState.HookColor, Callback = function(color) KYS_ESPState.HookColor = color end })
worldSection:AddColorPicker({ Name = "Gate Color", Flag = "KYS Gate Color", Default = KYS_ESPState.GateColor, Callback = function(color) KYS_ESPState.GateColor = color end })
worldSection:AddColorPicker({ Name = "Window Color", Flag = "KYS Window Color", Default = KYS_ESPState.WindowColor, Callback = function(color) KYS_ESPState.WindowColor = color end })
worldSection:AddColorPicker({ Name = "Pallet Color", Flag = "KYS Pallet Color", Default = KYS_ESPState.PalletColor, Callback = function(color) KYS_ESPState.PalletColor = color end })
worldSection:AddColorPicker({ Name = "SCP / Zombie Color", Flag = "KYS SCP Zombie Color", Default = KYS_ESPState.SCPZombieColor, Callback = function(color) KYS_ESPState.SCPZombieColor = color end })
end
for _, player in ipairs(Players:GetPlayers()) do
KYS_WatchPlayer(player)
end
table.insert(KYS_Connections, Players.PlayerAdded:Connect(KYS_WatchPlayer))
table.insert(KYS_Connections, Players.PlayerRemoving:Connect(KYS_UnwatchPlayer))
table.insert(KYS_Connections, Workspace.ChildAdded:Connect(function(child)
if child.Name == "Map" or child.Name == "Map1" then
KYS_AttachESPRoot(child)
if KYS_ESPState.WorldMasterESP and KYS_AnyWorldEnabled() then KYS_StartWorldLoop() end
end
end))
table.insert(KYS_Connections, Workspace.ChildRemoved:Connect(function(child)
if child.Name == "Map" or child.Name == "Map1" then
KYS_RefreshESPRoots()
end
end))
KYS_RefreshESPRoots()
getgenv().KYS_VD_VisualESP_Cleanup = function()
KYS_Dead = true
KYS_ClearAllPlayerESP()
KYS_ClearAllWorldESP()
for _, conn in ipairs(KYS_Connections) do
if conn then pcall(function() conn:Disconnect() end) end
end
for _, conns in pairs(KYS_PlayerConns) do
for _, conn in ipairs(conns) do
if conn then pcall(function() conn:Disconnect() end) end
end
end
for _, conn in pairs(KYS_MapAdd) do
if conn then pcall(function() conn:Disconnect() end) end
end
for _, conn in pairs(KYS_MapRem) do
if conn then pcall(function() conn:Disconnect() end) end
end
if KYS_ESPFolder and KYS_ESPFolder.Parent then
KYS_ESPFolder:Destroy()
end
end
KYS_SafeNotify("Visual ESP", "Highlight ESP V2 loaded. Anti double nametag aktif.", 3)
end
-- =====================================================
-- FULLBRIGHT
-- =====================================================
task.spawn(function()
while not VD.Destroyed do
if VD.Fullbright then
local weatherTheme = VD.VIS_WeatherTheme and KYS_WeatherPresets[VD.VIS_WeatherTheme]
local keepWeatherLighting = VD.VIS_WeatherTheme and VD.VIS_WeatherTheme ~= "Default" and weatherTheme and weatherTheme.Lighting
if keepWeatherLighting then
for k, v in pairs(weatherTheme.Lighting) do
pcall(function() Lighting[k] = v end)
end
Lighting.Brightness = math.max(Lighting.Brightness, 2)
Lighting.GlobalShadows = false
if VD.NO_Fog then
Lighting.FogStart = 0
Lighting.FogEnd = 100000
end
else
Lighting.Brightness = 2
Lighting.ClockTime = 14
Lighting.GlobalShadows = false
Lighting.OutdoorAmbient = Color3.fromRGB(128, 128, 128)
Lighting.FogStart = 0
Lighting.FogEnd = 100000
end
for _, v in pairs(Lighting:GetChildren()) do
if v:IsA("Atmosphere") and v.Name ~= "VD_WeatherAtmosphere" then
v.Density = 0; v.Offset = 0; v.Glare = 0; v.Haze = 0
end
if v:IsA("BlurEffect") then v.Size = 0 end
if v:IsA("ColorCorrectionEffect") and v.Name ~= "VD_WeatherCC" then v.Enabled = false end
if v:IsA("SunRaysEffect") then v.Enabled = false end
end
else
if VD.VIS_WeatherTheme and VD.VIS_WeatherTheme ~= "Default" and KYS_WeatherPresets[VD.VIS_WeatherTheme] then
local theme = KYS_WeatherPresets[VD.VIS_WeatherTheme]
if theme.Lighting then
for k, v in pairs(theme.Lighting) do
pcall(function() Lighting[k] = v end)
end
end
else
Lighting.Brightness = originalLighting.Brightness
Lighting.ClockTime = originalLighting.ClockTime
Lighting.FogEnd = originalLighting.FogEnd
Lighting.FogStart = originalLighting.FogStart or 0
Lighting.GlobalShadows = originalLighting.GlobalShadows
Lighting.OutdoorAmbient = originalLighting.OutdoorAmbient
for _, v in pairs(Lighting:GetChildren()) do
if v:IsA("Atmosphere") and originalLighting.Atmosphere then
v.Density = originalLighting.Atmosphere.Density or 0.3
v.Offset = originalLighting.Atmosphere.Offset or 0.25
v.Glare = originalLighting.Atmosphere.Glare or 0
v.Haze = originalLighting.Atmosphere.Haze or 0
end
if v:IsA("BlurEffect") and originalLighting.Blur then v.Size = originalLighting.Blur.Size or 0 end
if v:IsA("ColorCorrectionEffect") and originalLighting.ColorCorrection then
v.Enabled = originalLighting
.ColorCorrection.Enabled or false
end
if v:IsA("SunRaysEffect") and originalLighting.SunRays then
v.Enabled = originalLighting.SunRays.Enabled or
false
end
end
end
end
task.wait(0.5)
end
end)
-- =====================================================-- =====================================================
-- MOVEMENT & NOCLIP
-- =====================================================
local originalCanCollide = {}
RunService.Stepped:Connect(function()
if VD.Noclip then
local char = LocalPlayer.Character
if char then
for _, descendant in ipairs(char:GetDescendants()) do
if descendant:IsA("BasePart") then
if originalCanCollide[descendant] == nil then
originalCanCollide[descendant] = descendant.CanCollide
end
descendant.CanCollide = false
end
end
end
end
end)
getgenv().VD_DisableNoclip = function()
for part, canCollide in pairs(originalCanCollide) do
if part and part.Parent then
pcall(function() part.CanCollide = canCollide end)
end
end
originalCanCollide = {}
end
LocalPlayer.CharacterRemoving:Connect(function(char)
if char == LocalPlayer.Character then
originalCanCollide = {}
end
end)
RunService.Heartbeat:Connect(function(deltaTime)
local myChar = LocalPlayer.Character
local myHum = myChar and myChar:FindFirstChildOfClass("Humanoid")
if myHum then
if VD.Speed and myHum.WalkSpeed ~= VD.SpeedValue then myHum.WalkSpeed = VD.SpeedValue end
if VD.Jump and myHum.JumpPower ~= VD.JumpValue then myHum.JumpPower = VD.JumpValue end
end
end)
UserInputService.JumpRequest:Connect(function()
local myChar = LocalPlayer.Character
local myHum = myChar and myChar:FindFirstChildOfClass("Humanoid")
if VD.InfiniteJump and myHum then
myHum:ChangeState(Enum.HumanoidStateType.Jumping)
end
end)
-- =====================================================
-- HIDE SKILL CHECK UI
-- =====================================================
local cachedPlayerGui = LocalPlayer:WaitForChild("PlayerGui")
RunService.RenderStepped:Connect(function()
if VD.HideSkillUI then
if not cachedPlayerGui then cachedPlayerGui = LocalPlayer:FindFirstChild("PlayerGui") end
local a = cachedPlayerGui and cachedPlayerGui:FindFirstChild("SkillCheckPromptGui")
local b = cachedPlayerGui and cachedPlayerGui:FindFirstChild("SkillCheckPromptGui-con")
if a and a.Enabled then a.Enabled = false end
if b and b.Enabled then b.Enabled = false end
end
end)
-- =====================================================
-- AUTO PARRY + AUTO SKILLCHECK (ported from survivor)
-- =====================================================
function VD_Notify(title, content, duration)
pcall(function()
if Window and Window.Notify then
Window:Notify({
Title = title,
Content = content,
Duration = duration or 2,
Icon = "lucide:info",
})
end
end)
end
-- =====================================================
-- SILENT AIM: TWIST OF FATE
-- =====================================================
(function()
local KYS_ToFState = {
Connection = nil,
LaserBeam = nil,
TargetGui = nil,
InputBegan = nil,
InputEnded = nil,
TouchInput = nil,
IsAiming = false,
SavedUIPos = UDim2.new(0.5, -120, 0, 110),
SCPCache = {},
SCPCacheTimer = 0,
}
local KYS_ToFKeyCodes = {
None = nil,
Q = Enum.KeyCode.Q,
E = Enum.KeyCode.E,
R = Enum.KeyCode.R,
T = Enum.KeyCode.T,
F = Enum.KeyCode.F,
G = Enum.KeyCode.G,
H = Enum.KeyCode.H,
J = Enum.KeyCode.J,
K = Enum.KeyCode.K,
L = Enum.KeyCode.L,
X = Enum.KeyCode.X,
Z = Enum.KeyCode.Z,
}
local function KYS_ToFGetEvent()
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local items = remotes and remotes:FindFirstChild("Items")
local tof = items and items:FindFirstChild("Twist of Fate")
local fire = tof and tof:FindFirstChild("Fire")
if fire and fire:IsA("RemoteEvent") then
return fire
end
return nil
end
local function KYS_ToFGetGunObject()
local char = LocalPlayer.Character
if not char then return nil end
local baseToF = char:FindFirstChild("Twist of Fate", true)
if not baseToF then return nil end
local rightArm = baseToF:FindFirstChild("Right Arm")
if rightArm then
local gunPart = rightArm:FindFirstChild("gun")
if gunPart then return gunPart end
local emperorGun = rightArm:FindFirstChild("EmperorGun")
if emperorGun then return emperorGun end
end
return baseToF
end
local function KYS_ToFIsTargetVisible(originPos, targetPos, targetCharacter)
local direction = targetPos - originPos
local distance = direction.Magnitude
if distance < 0.1 then return true end
local rayParams = RaycastParams.new()
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local excludeList = {}
local localChar = LocalPlayer.Character
if localChar then table.insert(excludeList, localChar) end
if targetCharacter and targetCharacter ~= localChar then table.insert(excludeList, targetCharacter) end
if KYS_ToFState.LaserBeam then table.insert(excludeList, KYS_ToFState.LaserBeam) end
rayParams.FilterDescendantsInstances = excludeList
local result = workspace:Raycast(originPos, direction.Unit * distance, rayParams)
return result == nil
end
local function KYS_ToFGetSCPs()
if tick() - KYS_ToFState.SCPCacheTimer < 0.5 then
return KYS_ToFState.SCPCache
end
local newTargets = {}
local mapFolder = workspace:FindFirstChild("Map")
if mapFolder then
for _, container in pairs(mapFolder:GetDescendants()) do
if container:IsA("Model") then
local attributes = container:GetAttributes()
if container:GetAttribute("CorpseCreated0492") or next(attributes) ~= nil then
local root = container:FindFirstChild("HumanoidRootPart")
if root then table.insert(newTargets, root) end
end
end
end
end
KYS_ToFState.SCPCache = newTargets
KYS_ToFState.SCPCacheTimer = tick()
return KYS_ToFState.SCPCache
end
local function KYS_ToFGetTargetPosition()
local gunObj = KYS_ToFGetGunObject()
local char = LocalPlayer.Character
if not (gunObj and char) then return nil, nil, nil, nil end
local hrp = char:FindFirstChild("HumanoidRootPart")
if not hrp then return nil, nil, nil, nil end
local myPos = hrp.Position
local originPos
if char:GetAttribute("IsCarried") then
originPos = hrp.Position + (hrp.CFrame.LookVector * 2)
else
pcall(function()
originPos = gunObj:IsA("BasePart") and gunObj.Position
or (gunObj:FindFirstChildOfClass("BasePart") and gunObj:FindFirstChildOfClass("BasePart").Position)
end)
originPos = originPos or Vector3.new(myPos.X, myPos.Y + 1.5, myPos.Z)
end
local function predictTarget(torso, targetCharacter)
local targetPos = torso.Position
if VD.TOF_WallCheck and not KYS_ToFIsTargetVisible(originPos, targetPos, targetCharacter) then
return nil, nil, nil, nil
end
local targetVel = Vector3.new(0, 0, 0)
local rootPart = targetCharacter and (targetCharacter:FindFirstChild("HumanoidRootPart") or torso)
if rootPart then targetVel = rootPart.Velocity end
local directionRaw = targetPos - originPos
local distance = directionRaw.Magnitude
if distance < 0.1 then return nil, nil, nil, nil end
if distance < 5 then return directionRaw.Unit, gunObj, originPos, targetPos end
local travelTime = distance / 400
local predictedPos = targetPos + (targetVel * travelTime)
for _ = 1, 2 do
local newDist = (predictedPos - originPos).Magnitude
travelTime = newDist / 400
predictedPos = targetPos + (targetVel * travelTime)
end
local finalDirection = predictedPos - originPos
if finalDirection.Magnitude < 0.1 then return nil, nil, nil, nil end
return finalDirection.Unit, gunObj, originPos, predictedPos
end
local targetMode = VD.TOF_TargetMode or "Killer"
if targetMode == "Killer" then
local closestTorso, closestChar, shortestDist = nil, nil, math.huge
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Team and player.Team.Name == "Killer" and player.Character then
local torso = player.Character:FindFirstChild("Torso")
or player.Character:FindFirstChild("UpperTorso")
or player.Character:FindFirstChild("HumanoidRootPart")
if torso then
local dist = (myPos - torso.Position).Magnitude
if dist < shortestDist then
shortestDist = dist
closestTorso = torso
closestChar = player.Character
end
end
end
end
if not closestTorso then return nil, nil, nil, nil end
return predictTarget(closestTorso, closestChar)
elseif targetMode == "Survivors" then
local bestTorso, bestChar, bestDot = nil, nil, -math.huge
local cam = workspace.CurrentCamera
local camLook = cam.CFrame.LookVector
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Team and player.Team.Name == "Survivors" and player.Character then
local torso = player.Character:FindFirstChild("Torso")
or player.Character:FindFirstChild("UpperTorso")
or player.Character:FindFirstChild("HumanoidRootPart")
if torso then
local dirToTarget = torso.Position - cam.CFrame.Position
if dirToTarget.Magnitude > 0.1 then
local dot = camLook:Dot(dirToTarget.Unit)
if dot > 0.5 and dot > bestDot then
bestDot = dot
bestTorso = torso
bestChar = player.Character
end
end
end
end
end
if not bestTorso then return nil, nil, nil, nil end
return predictTarget(bestTorso, bestChar)
elseif targetMode == "Zombie" then
local bestPart, bestDot = nil, -math.huge
local cam = workspace.CurrentCamera
local camLook = cam.CFrame.LookVector
for _, root in ipairs(KYS_ToFGetSCPs()) do
if root and root.Parent then
local dirToTarget = root.Position - cam.CFrame.Position
if dirToTarget.Magnitude > 0.1 then
local dot = camLook:Dot(dirToTarget.Unit)
if dot > 0.5 and dot > bestDot then
bestDot = dot
bestPart = root
end
end
end
end
if not bestPart then return nil, nil, nil, nil end
return predictTarget(bestPart, bestPart.Parent)
end
return nil, nil, nil, nil
end
local function KYS_ToFUpdateLaser(originPos, targetPos)
if not KYS_ToFState.LaserBeam then
local laser = Instance.new("Part")
laser.Name = "ToFLaser"
laser.Anchored = true
laser.CanCollide = false
laser.CanTouch = false
laser.CastShadow = false
laser.Material = Enum.Material.Neon
laser.Color = Color3.fromRGB(255, 50, 50)
laser.Parent = workspace
KYS_ToFState.LaserBeam = laser
end
local dist = (targetPos - originPos).Magnitude
KYS_ToFState.LaserBeam.Size = Vector3.new(0.05, 0.05, dist)
KYS_ToFState.LaserBeam.CFrame = CFrame.new((originPos + targetPos) / 2, targetPos)
KYS_ToFState.LaserBeam.Transparency = 0
end
local function KYS_ToFClearLaser()
if KYS_ToFState.LaserBeam then
pcall(function() KYS_ToFState.LaserBeam:Destroy() end)
KYS_ToFState.LaserBeam = nil
end
end
local AimConfig = {
Pistol_BlockKnocked = true,
}
local function IsDowned(char)
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if not hrp then return true end
local state = char:GetAttribute("State")
return state == "Downed" or state == "Dead"
end
local function KYS_ToFGetMobileShootButton()
local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
local survivorMob = playerGui and playerGui:FindFirstChild("Survivor-mob")
local controls = survivorMob and survivorMob:FindFirstChild("Controls")
local guiMob = controls and controls:FindFirstChild("Gui-mob")
if not guiMob then return nil end
local directNames = { "attack", "Attack", "shoot", "Shoot", "fire", "Fire" }
for _, name in ipairs(directNames) do
local btn = guiMob:FindFirstChild(name, true)
if btn and btn:IsA("GuiObject") then return btn end
end
for _, obj in ipairs(guiMob:GetDescendants()) do
if obj:IsA("GuiButton") and obj.Visible then
return obj
end
end
return guiMob:IsA("GuiObject") and guiMob or nil
end
local function KYS_ToFIsTouchOnShootButton(input)
local shootButton = KYS_ToFGetMobileShootButton()
if not (shootButton and shootButton.Visible) then return false end
local pos = input.Position
local absPos = shootButton.AbsolutePosition
local absSize = shootButton.AbsoluteSize
return pos.X >= absPos.X and pos.X <= absPos.X + absSize.X
and pos.Y >= absPos.Y and pos.Y <= absPos.Y + absSize.Y
end
local function KYS_ToFDoShoot()
if not VD.TOF_SilentAim then return end
AimConfig.Pistol_BlockKnocked = VD.TOF_BlockKnocked ~= false
local char = LocalPlayer.Character
if char then
if AimConfig.Pistol_BlockKnocked and IsDowned(char) then
return
end
end
local targetDirection, gunObject, originPos, targetPos = KYS_ToFGetTargetPosition()
if not (targetDirection and gunObject and targetPos and originPos) then return end
local tofEvent = KYS_ToFGetEvent()
if not tofEvent then return end
local freshDirection = targetPos - originPos
if freshDirection.Magnitude < 0.1 then return end
pcall(function()
tofEvent:FireServer(gunObject, freshDirection.Unit)
end)
end
local KYS_ToFModeButtons = {}
local function KYS_ToFRefreshTargetButtons()
local modes = {
Killer = { Color3.fromRGB(180, 45, 45), Color3.fromRGB(255, 180, 180) },
Survivors = { Color3.fromRGB(25, 80, 150), Color3.fromRGB(160, 210, 255) },
Zombie = { Color3.fromRGB(120, 80, 10), Color3.fromRGB(255, 210, 100) },
}
for modeName, btn in pairs(KYS_ToFModeButtons) do
if btn and btn.Parent then
local active = modeName == (VD.TOF_TargetMode or "Killer")
local colors = modes[modeName]
btn.BackgroundColor3 = active and colors[1] or Color3.fromRGB(30, 32, 40)
btn.TextColor3 = active and colors[2] or Color3.fromRGB(155, 160, 175)
end
end
end
local function KYS_ToFSetTargetMode(modeName, notify)
if modeName ~= "Killer" and modeName ~= "Survivors" and modeName ~= "Zombie" then return end
VD.TOF_TargetMode = modeName
KYS_ToFRefreshTargetButtons()
if notify then VD_Notify("Target Mode", modeName, 1) end
end
local function KYS_ToFCreateTargetSelectorUI()
local parent = GetSafeGuiParent()
if not parent then return end
if KYS_ToFState.TargetGui and KYS_ToFState.TargetGui.Parent then return end
local old = parent:FindFirstChild("ToFTargetSelector")
if old then pcall(function() old:Destroy() end) end
local gui = Instance.new("ScreenGui")
gui.Name = "ToFTargetSelector"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.Parent = parent
local frame = Instance.new("Frame")
frame.Name = "Main"
frame.Size = UDim2.new(0, 180, 0, 126)
frame.Position = KYS_ToFState.SavedUIPos
frame.BackgroundColor3 = Color3.fromRGB(16, 18, 24)
frame.BorderSizePixel = 0
frame.Active = true
frame.Parent = gui
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 8)
local stroke = Instance.new("UIStroke", frame)
stroke.Color = Color3.fromRGB(96, 72, 160)
stroke.Thickness = 1
local header = Instance.new("Frame")
header.Size = UDim2.new(1, 0, 0, 28)
header.BackgroundColor3 = Color3.fromRGB(24, 26, 34)
header.BorderSizePixel = 0
header.Parent = frame
Instance.new("UICorner", header).CornerRadius = UDim.new(0, 8)
local headerFix = Instance.new("Frame")
headerFix.Size = UDim2.new(1, 0, 0, 10)
headerFix.Position = UDim2.new(0, 0, 1, -10)
headerFix.BackgroundColor3 = Color3.fromRGB(24, 26, 34)
headerFix.BorderSizePixel = 0
headerFix.Parent = header
local headerDiv = Instance.new("Frame")
headerDiv.Size = UDim2.new(1, 0, 0, 1)
headerDiv.Position = UDim2.new(0, 0, 1, -1)
headerDiv.BackgroundColor3 = Color3.fromRGB(48, 42, 72)
headerDiv.BorderSizePixel = 0
headerDiv.Parent = header
local dragArea = Instance.new("Frame")
dragArea.Size = UDim2.new(1, -34, 1, 0)
dragArea.BackgroundTransparency = 1
dragArea.Parent = header
local minimizeBtn = Instance.new("TextButton")
minimizeBtn.Size = UDim2.new(0, 28, 1, 0)
minimizeBtn.Position = UDim2.new(1, -30, 0, 0)
minimizeBtn.BackgroundTransparency = 1
minimizeBtn.Text = "-"
minimizeBtn.TextColor3 = Color3.fromRGB(185, 190, 205)
minimizeBtn.Font = Enum.Font.GothamBold
minimizeBtn.TextSize = 14
minimizeBtn.Parent = header
local headerLbl = Instance.new("TextLabel")
headerLbl.Size = UDim2.new(1, -44, 1, 0)
headerLbl.Position = UDim2.new(0, 10, 0, 0)
headerLbl.BackgroundTransparency = 1
headerLbl.Text = "TOF TARGET MODE"
headerLbl.TextColor3 = Color3.fromRGB(210, 215, 230)
headerLbl.Font = Enum.Font.GothamBold
headerLbl.TextSize = 10
headerLbl.TextXAlignment = Enum.TextXAlignment.Left
headerLbl.Parent = header
local btnContainer = Instance.new("Frame")
btnContainer.Size = UDim2.new(1, -16, 0, 86)
btnContainer.Position = UDim2.new(0, 8, 0, 34)
btnContainer.BackgroundTransparency = 1
btnContainer.Parent = frame
local layout = Instance.new("UIListLayout", btnContainer)
layout.FillDirection = Enum.FillDirection.Vertical
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Padding = UDim.new(0, 5)
local isMinimized = false
minimizeBtn.MouseButton1Click:Connect(function()
isMinimized = not isMinimized
minimizeBtn.Text = isMinimized and "+" or "-"
btnContainer.Visible = not isMinimized
frame.Size = isMinimized and UDim2.new(0, 180, 0, 28) or UDim2.new(0, 180, 0, 126)
end)
local modes = {
{ Internal = "Killer", Display = "KILLER K" },
{ Internal = "Survivors", Display = "SURVIVOR J" },
{ Internal = "Zombie", Display = "ZOMBIE L" },
}
KYS_ToFModeButtons = {}
for i, mode in ipairs(modes) do
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, 0, 0, 25)
btn.BorderSizePixel = 0
btn.Font = Enum.Font.GothamBold
btn.TextSize = 11
btn.Text = mode.Display
btn.TextXAlignment = Enum.TextXAlignment.Center
btn.LayoutOrder = i
btn.Parent = btnContainer
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6)
local btnStroke = Instance.new("UIStroke", btn)
btnStroke.Color = Color3.fromRGB(58, 62, 78)
btnStroke.Thickness = 1
btn.MouseButton1Click:Connect(function()
KYS_ToFSetTargetMode(mode.Internal, false)
end)
btn.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch then
KYS_ToFSetTargetMode(mode.Internal, false)
end
end)
KYS_ToFModeButtons[mode.Internal] = btn
end
KYS_ToFRefreshTargetButtons()
local dragging = false
local dragStart, startPos
dragArea.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragStart = input.Position
startPos = frame.Position
dragging = true
end
end)
dragArea.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end)
UserInputService.InputChanged:Connect(function(input)
if not dragging then return end
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
local delta = input.Position - dragStart
local newPos = UDim2.new(
startPos.X.Scale,
startPos.X.Offset + delta.X,
startPos.Y.Scale,
startPos.Y.Offset + delta.Y
)
frame.Position = newPos
KYS_ToFState.SavedUIPos = newPos
end
end)
KYS_ToFState.TargetGui = gui
end
local function KYS_ToFDestroyTargetSelectorUI()
if KYS_ToFState.TargetGui then
pcall(function() KYS_ToFState.TargetGui:Destroy() end)
KYS_ToFState.TargetGui = nil
end
KYS_ToFModeButtons = {}
end
local function KYS_ToFStartConnection()
if KYS_ToFState.Connection then return end
KYS_ToFState.Connection = RunService.Heartbeat:Connect(function()
if not VD.TOF_SilentAim or not KYS_ToFState.IsAiming then
if KYS_ToFState.LaserBeam then KYS_ToFState.LaserBeam.Transparency = 1 end
return
end
local _, _, originPos, targetPos = KYS_ToFGetTargetPosition()
if originPos and targetPos then
pcall(function()
local char = LocalPlayer.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if hrp and not char:GetAttribute("IsCarried") then
hrp.CFrame = CFrame.new(hrp.Position, Vector3.new(targetPos.X, hrp.Position.Y, targetPos.Z))
end
end)
if VD.TOF_Laser then
KYS_ToFUpdateLaser(originPos, targetPos)
elseif KYS_ToFState.LaserBeam then
KYS_ToFState.LaserBeam.Transparency = 1
end
elseif KYS_ToFState.LaserBeam then
KYS_ToFState.LaserBeam.Transparency = 1
end
end)
end
local function KYS_ToFStopConnection()
if KYS_ToFState.Connection then
pcall(function() KYS_ToFState.Connection:Disconnect() end)
KYS_ToFState.Connection = nil
end
KYS_ToFState.IsAiming = false
KYS_ToFClearLaser()
end
local function KYS_ToFDisconnectInputs()
if KYS_ToFState.InputBegan then pcall(function() KYS_ToFState.InputBegan:Disconnect() end) end
if KYS_ToFState.InputEnded then pcall(function() KYS_ToFState.InputEnded:Disconnect() end) end
KYS_ToFState.InputBegan = nil
KYS_ToFState.InputEnded = nil
end
local KYS_SetToFSilentAim
local function KYS_ToFEnsureInputs()
if not KYS_ToFState.InputBegan then
KYS_ToFState.InputBegan = UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
local keyCode = KYS_ToFKeyCodes[VD.TOF_Key or "None"]
if keyCode and input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == keyCode then
KYS_SetToFSilentAim(not VD.TOF_SilentAim)
return
end
if not VD.TOF_SilentAim then return end
if input.UserInputType == Enum.UserInputType.MouseButton1
or (input.UserInputType == Enum.UserInputType.Touch and KYS_ToFIsTouchOnShootButton(input)) then
KYS_ToFState.IsAiming = true
if input.UserInputType == Enum.UserInputType.Touch then
KYS_ToFState.TouchInput = input
end
KYS_ToFDoShoot()
return
end
if input.UserInputType == Enum.UserInputType.Keyboard then
if input.KeyCode == Enum.KeyCode.K then
KYS_ToFSetTargetMode("Killer", true)
elseif input.KeyCode == Enum.KeyCode.J then
KYS_ToFSetTargetMode("Survivors", true)
elseif input.KeyCode == Enum.KeyCode.L then
KYS_ToFSetTargetMode("Zombie", true)
end
end
end)
end
if not KYS_ToFState.InputEnded then
KYS_ToFState.InputEnded = UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or (input.UserInputType == Enum.UserInputType.Touch and input == KYS_ToFState.TouchInput) then
KYS_ToFState.IsAiming = false
if input == KYS_ToFState.TouchInput then KYS_ToFState.TouchInput = nil end
if KYS_ToFState.LaserBeam then KYS_ToFState.LaserBeam.Transparency = 1 end
end
end)
end
end
KYS_SetToFSilentAim = function(enabled)
VD.TOF_SilentAim = enabled and true or false
KYS_ToFEnsureInputs()
if VD.TOF_SilentAim then
KYS_ToFCreateTargetSelectorUI()
KYS_ToFStartConnection()
else
KYS_ToFDestroyTargetSelectorUI()
KYS_ToFStopConnection()
end
end
KYS_ToFEnsureInputs()
getgenv().KYS_SetToFSilentAim = KYS_SetToFSilentAim
getgenv().KYS_ToFClearLaser = KYS_ToFClearLaser
getgenv().KYS_ToFSetTargetMode = KYS_ToFSetTargetMode
end)();
-- =====================================================
-- HIDE SURVIVOR ICON
-- =====================================================
(function()
local KYS_HideSurvivorIconState = {
Connection = nil,
Originals = {},
}
local KYS_HideSurvivorIconImage = "rbxassetid://80891639562743"
local KYS_HideSurvivorIconText = "NxH"
local function KYS_GetSurvivorSlots()
local slots = {}
local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
if not playerGui then return slots end
for _, gui in ipairs(playerGui:GetChildren()) do
if not (gui:IsA("ScreenGui") and gui.Name:match("%-mob$")) then
continue
end
local frame = gui and gui:FindFirstChild("Frame")
if frame then
for i = 1, 5 do
local survivorFrame = frame:FindFirstChild("Survivor" .. i)
local imageLabel = survivorFrame and survivorFrame:FindFirstChild("ImageLabel")
local textLabel = survivorFrame and survivorFrame:FindFirstChild("TextLabel")
if (imageLabel and imageLabel:IsA("ImageLabel")) or (textLabel and textLabel:IsA("TextLabel")) then
table.insert(slots, {
ImageLabel = imageLabel,
TextLabel = textLabel,
})
end
end
end
end
return slots
end
local function KYS_ApplyHideSurvivorIcon()
for _, slot in ipairs(KYS_GetSurvivorSlots()) do
local imageLabel = slot.ImageLabel
if imageLabel and imageLabel:IsA("ImageLabel") then
if not KYS_HideSurvivorIconState.Originals[imageLabel] then
KYS_HideSurvivorIconState.Originals[imageLabel] = {
Image = imageLabel.Image,
ImageColor3 = imageLabel.ImageColor3,
ImageTransparency = imageLabel.ImageTransparency,
ImageRectOffset = imageLabel.ImageRectOffset,
ImageRectSize = imageLabel.ImageRectSize,
ScaleType = imageLabel.ScaleType,
}
end
imageLabel.Image = KYS_HideSurvivorIconImage
imageLabel.ImageColor3 = Color3.fromRGB(255, 255, 255)
imageLabel.ImageTransparency = 0
imageLabel.ImageRectOffset = Vector2.new(0, 0)
imageLabel.ImageRectSize = Vector2.new(0, 0)
imageLabel.ScaleType = Enum.ScaleType.Crop
end
local textLabel = slot.TextLabel
if textLabel and textLabel:IsA("TextLabel") then
if not KYS_HideSurvivorIconState.Originals[textLabel] then
KYS_HideSurvivorIconState.Originals[textLabel] = {
Text = textLabel.Text,
TextColor3 = textLabel.TextColor3,
TextTransparency = textLabel.TextTransparency,
}
end
textLabel.Text = KYS_HideSurvivorIconText
textLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
textLabel.TextTransparency = 0
end
end
end
local function KYS_RestoreSurvivorIcons()
for object, original in pairs(KYS_HideSurvivorIconState.Originals) do
if object and object.Parent and original then
pcall(function()
if original.Image ~= nil and object:IsA("ImageLabel") then
object.Image = original.Image
object.ImageColor3 = original.ImageColor3
object.ImageTransparency = original.ImageTransparency
object.ImageRectOffset = original.ImageRectOffset
object.ImageRectSize = original.ImageRectSize
object.ScaleType = original.ScaleType
end
if original.Text ~= nil and object:IsA("TextLabel") then
object.Text = original.Text
object.TextColor3 = original.TextColor3
object.TextTransparency = original.TextTransparency
end
end)
end
end
KYS_HideSurvivorIconState.Originals = {}
end
local function KYS_SetHideSurvivorIcon(enabled)
VD.VIS_HideSurvivorIcon = enabled and true or false
if VD.VIS_HideSurvivorIcon then
KYS_ApplyHideSurvivorIcon()
if not KYS_HideSurvivorIconState.Connection then
KYS_HideSurvivorIconState.Connection = RunService.Heartbeat:Connect(function()
if VD.VIS_HideSurvivorIcon then
KYS_ApplyHideSurvivorIcon()
end
end)
end
else
if KYS_HideSurvivorIconState.Connection then
pcall(function() KYS_HideSurvivorIconState.Connection:Disconnect() end)
KYS_HideSurvivorIconState.Connection = nil
end
KYS_RestoreSurvivorIcons()
end
end
getgenv().KYS_SetHideSurvivorIcon = KYS_SetHideSurvivorIcon
end)();
-- =====================================================
-- SHOW HOOK COUNTER (SURVIVOR & KILLER)
-- =====================================================
(function()
local KYS_HookCounterState = {
Connection = nil,
}
local function KYS_UpdateHookCounter(enabled)
local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
if not playerGui then return end
for _, gui in ipairs(playerGui:GetChildren()) do
if gui:IsA("ScreenGui") and gui.Name:match("%-mob$") then
local frame = gui:FindFirstChild("Frame")
if frame then
for i = 1, 5 do
local survivorFrame = frame:FindFirstChild("Survivor" .. i)
local imageLabel = survivorFrame and survivorFrame:FindFirstChild("ImageLabel")
local textLabel = survivorFrame and survivorFrame:FindFirstChild("TextLabel")
if imageLabel and textLabel then
-- Handle original Counter if exists
local counter = imageLabel:FindFirstChild("Counter")
if counter then
pcall(function()
if counter.Visible ~= enabled then
counter.Visible = enabled
end
end)
end
-- Handle Custom Text Hook Counter
local labelName = "KYS_CustomHookCounter"
local customLabel = imageLabel:FindFirstChild(labelName)
if enabled then
local playerName = textLabel.Text
local player = nil
for _, p in ipairs(game.Players:GetPlayers()) do
if p.Name == playerName or p.DisplayName == playerName then
player = p
break
end
end
local hookCount = 0
if player then
hookCount = player:GetAttribute("HookCount") or (player.Character and player.Character:GetAttribute("HookCount")) or 0
end
if not customLabel then
customLabel = Instance.new("TextLabel")
customLabel.Name = labelName
customLabel.Size = UDim2.new(1, 0, 0.35, 0)
customLabel.Position = UDim2.new(0, 0, 0.65, 0)
customLabel.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
customLabel.BackgroundTransparency = 0.5
customLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
customLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
customLabel.TextStrokeTransparency = 0
customLabel.TextScaled = true
customLabel.Font = Enum.Font.SourceSansBold
customLabel.Parent = imageLabel
end
customLabel.Visible = true
if hookCount >= 3 then
customLabel.Text = "DEAD"
customLabel.TextColor3 = Color3.fromRGB(255, 75, 75)
else
customLabel.Text = "Hooks: " .. tostring(hookCount)
if hookCount == 2 then
customLabel.TextColor3 = Color3.fromRGB(255, 140, 0)
elseif hookCount == 1 then
customLabel.TextColor3 = Color3.fromRGB(255, 215, 0)
else
customLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
end
end
else
if customLabel then
customLabel.Visible = false
end
end
end
end
end
end
end
end
local function KYS_SetShowHookCounter(enabled)
VD.VIS_ShowHookCounter = enabled and true or false
if VD.VIS_ShowHookCounter then
KYS_UpdateHookCounter(true)
if not KYS_HookCounterState.Connection then
KYS_HookCounterState.Connection = RunService.Heartbeat:Connect(function()
if VD.VIS_ShowHookCounter then
KYS_UpdateHookCounter(true)
end
end)
end
else
if KYS_HookCounterState.Connection then
pcall(function() KYS_HookCounterState.Connection:Disconnect() end)
KYS_HookCounterState.Connection = nil
end
KYS_UpdateHookCounter(false)
-- Delete the custom label to keep GUI clean
local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
if playerGui then
for _, gui in ipairs(playerGui:GetChildren()) do
if gui:IsA("ScreenGui") and gui.Name:match("%-mob$") then
local frame = gui:FindFirstChild("Frame")
if frame then
for i = 1, 5 do
local survivorFrame = frame:FindFirstChild("Survivor" .. i)
local imageLabel = survivorFrame and survivorFrame:FindFirstChild("ImageLabel")
customLabel = imageLabel and imageLabel:FindFirstChild("KYS_CustomHookCounter")
if customLabel then
pcall(function() customLabel:Destroy() end)
end
end
end
end
end
end
end
end
getgenv().KYS_SetShowHookCounter = KYS_SetShowHookCounter
end)();
-- =====================================================
-- SHOW PING & FPS
-- =====================================================
(function()
local KYS_PingFPSState = {
Gui = nil,
Connection = nil,
Frames = 0,
LastUpdate = 0,
}
local function KYS_GetPingValue()
local ok, value = pcall(function()
local stats = game:GetService("Stats")
local network = stats and stats:FindFirstChild("Network")
local serverStats = network and network:FindFirstChild("ServerStatsItem")
local dataPing = serverStats and serverStats:FindFirstChild("Data Ping")
if dataPing and dataPing.GetValue then
return math.floor(dataPing:GetValue() + 0.5)
end
if dataPing and dataPing.GetValueString then
local raw = tostring(dataPing:GetValueString())
return tonumber(raw:match("%d+"))
end
end)
if ok and value then return value end
return nil
end
local function KYS_CreatePingFPSGui()
local parent = GetSafeGuiParent()
if not parent then return nil end
local old = parent:FindFirstChild("KYS_PingFPSGui")
if old then pcall(function() old:Destroy() end) end
local sg = Instance.new("ScreenGui")
sg.Name = "KYS_PingFPSGui"
sg.ResetOnSpawn = false
sg.IgnoreGuiInset = true
sg.Parent = parent
local frame = Instance.new("Frame")
frame.Name = "Main"
frame.Size = UDim2.new(0, 118, 0, 44)
frame.Position = UDim2.new(0, 12, 0, 120)
frame.BackgroundColor3 = Color3.fromRGB(16, 18, 24)
frame.BackgroundTransparency = 0.1
frame.BorderSizePixel = 0
frame.Parent = sg
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 8)
local stroke = Instance.new("UIStroke", frame)
stroke.Color = Color3.fromRGB(96, 72, 160)
stroke.Thickness = 1
local label = Instance.new("TextLabel")
label.Name = "PingFPSLabel"
label.Size = UDim2.new(1, -12, 1, -8)
label.Position = UDim2.new(0, 6, 0, 4)
label.BackgroundTransparency = 1
label.Font = Enum.Font.GothamBold
label.TextSize = 13
label.TextColor3 = Color3.fromRGB(230, 235, 245)
label.TextXAlignment = Enum.TextXAlignment.Left
label.TextYAlignment = Enum.TextYAlignment.Center
label.Text = "PING: --ms\nFPS: --"
label.Parent = frame
return sg
end
local function KYS_SetShowPingFPS(enabled)
VD.VIS_ShowPingFPS = enabled and true or false
if VD.VIS_ShowPingFPS then
KYS_PingFPSState.Gui = KYS_PingFPSState.Gui or KYS_CreatePingFPSGui()
KYS_PingFPSState.Frames = 0
KYS_PingFPSState.LastUpdate = tick()
if not KYS_PingFPSState.Connection then
KYS_PingFPSState.Connection = RunService.RenderStepped:Connect(function()
if not VD.VIS_ShowPingFPS then return end
KYS_PingFPSState.Frames = KYS_PingFPSState.Frames + 1
local now = tick()
if now - KYS_PingFPSState.LastUpdate < 0.5 then return end
local fps = math.floor(KYS_PingFPSState.Frames / (now - KYS_PingFPSState.LastUpdate) + 0.5)
local ping = KYS_GetPingValue()
KYS_PingFPSState.Frames = 0
KYS_PingFPSState.LastUpdate = now
if not (KYS_PingFPSState.Gui and KYS_PingFPSState.Gui.Parent) then
KYS_PingFPSState.Gui = KYS_CreatePingFPSGui()
end
local label = KYS_PingFPSState.Gui and KYS_PingFPSState.Gui:FindFirstChild("PingFPSLabel", true)
if label then
label.Text = ("PING: %sms\nFPS: %d"):format(ping and tostring(ping) or "--", fps)
end
end)
end
else
if KYS_PingFPSState.Connection then
pcall(function() KYS_PingFPSState.Connection:Disconnect() end)
KYS_PingFPSState.Connection = nil
end
if KYS_PingFPSState.Gui then
pcall(function() KYS_PingFPSState.Gui:Destroy() end)
KYS_PingFPSState.Gui = nil
end
end
end
getgenv().KYS_SetShowPingFPS = KYS_SetShowPingFPS
end)();
-- =====================================================
-- SILENT AIM: FLASHLIGHT
-- =====================================================
(function()
local KYS_FlashlightAimState = {
Connection = nil,
LaserBeam = nil,
FlashlightPart = nil,
Active = false,
}
local function KYS_GetFlashlightActivateRemote()
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local items = remotes and remotes:FindFirstChild("Items")
local flashlight = items and items:FindFirstChild("Flashlight")
local activate = flashlight and flashlight:FindFirstChild("Activate")
if activate and activate:IsA("RemoteEvent") then
return activate
end
return nil
end
local function KYS_GetFlashlightTargetPart(char)
if not char then return nil end
local preferred = VD.FLASH_TargetPart or "Head"
local part = char:FindFirstChild(preferred)
if part and part:IsA("BasePart") then return part end
return char:FindFirstChild("Head")
or char:FindFirstChild("UpperTorso")
or char:FindFirstChild("Torso")
or char:FindFirstChild("HumanoidRootPart")
end
local function KYS_IsAliveCharacter(char)
local hum = char and char:FindFirstChildOfClass("Humanoid")
if not hum or hum.Health <= 0 then return false end
local state = char:GetAttribute("State")
return state ~= "Dead"
end
local function KYS_GetFlashlightTarget()
local localChar = LocalPlayer.Character
local localRoot = localChar and localChar:FindFirstChild("HumanoidRootPart")
if not localRoot then return nil end
local maxRange = tonumber(VD.FLASH_Range) or 120
local bestPart, bestScore = nil, math.huge
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Character and KYS_IsAliveCharacter(player.Character) then
local isKiller = player.Team and player.Team.Name == "Killer"
if isKiller then
local part = KYS_GetFlashlightTargetPart(player.Character)
if part then
local dist = (localRoot.Position - part.Position).Magnitude
if dist <= maxRange and dist < bestScore then
bestScore = dist
bestPart = part
end
end
end
end
end
return bestPart
end
local function KYS_ClearFlashlightLaser()
if KYS_FlashlightAimState.LaserBeam then
pcall(function() KYS_FlashlightAimState.LaserBeam:Destroy() end)
KYS_FlashlightAimState.LaserBeam = nil
end
end
local function KYS_GetFlashlightOrigin(cam)
local source = KYS_FlashlightAimState.FlashlightPart
if typeof and typeof(source) == "Instance" then
if source:IsA("BasePart") then
return source.Position
end
local part = source:FindFirstChildWhichIsA("BasePart", true)
if part then
return part.Position
end
end
local char = LocalPlayer.Character
local hand = char and (
char:FindFirstChild("RightHand")
or char:FindFirstChild("Right Arm")
or char:FindFirstChild("HumanoidRootPart")
)
if hand and hand:IsA("BasePart") then
return hand.Position
end
return cam and cam.CFrame.Position or nil
end
local function KYS_UpdateFlashlightLaser(originPos, targetPos)
if not KYS_FlashlightAimState.LaserBeam then
local laser = Instance.new("Part")
laser.Name = "FlashlightSilentAimLaser"
laser.Anchored = true
laser.CanCollide = false
laser.CanTouch = false
laser.CastShadow = false
laser.Material = Enum.Material.Neon
laser.Color = Color3.fromRGB(80, 220, 255)
laser.Transparency = 0
laser.Parent = workspace
KYS_FlashlightAimState.LaserBeam = laser
end
local dist = (targetPos - originPos).Magnitude
if dist < 0.1 then return end
local laser = KYS_FlashlightAimState.LaserBeam
laser.Size = Vector3.new(0.16, 0.16, dist)
laser.CFrame = CFrame.new((originPos + targetPos) / 2, targetPos)
laser.Transparency = 0
end
local function KYS_FlashlightAimStep()
if false then
if KYS_FlashlightAimState.LaserBeam then
KYS_FlashlightAimState.LaserBeam.Transparency = 1
end
return
end
if not (VD.FLASH_SilentAim and KYS_FlashlightAimState.Active) then
if KYS_FlashlightAimState.LaserBeam then
KYS_FlashlightAimState.LaserBeam.Transparency = 1
end
return
end
local cam = workspace.CurrentCamera
local targetPart = KYS_GetFlashlightTarget()
if not (cam and targetPart) then
if KYS_FlashlightAimState.LaserBeam then
KYS_FlashlightAimState.LaserBeam.Transparency = 1
end
return
end
local targetPos = targetPart.Position
local smooth = math.clamp(tonumber(VD.FLASH_Smooth) or 0.35, 0.05, 1)
local originPos = KYS_GetFlashlightOrigin(cam)
if VD.FLASH_Laser and originPos then
KYS_UpdateFlashlightLaser(originPos, targetPos)
elseif KYS_FlashlightAimState.LaserBeam then
KYS_FlashlightAimState.LaserBeam.Transparency = 1
end
pcall(function()
cam.CFrame = cam.CFrame:Lerp(CFrame.new(cam.CFrame.Position, targetPos), smooth)
end)
pcall(function()
local char = LocalPlayer.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if hrp then
hrp.CFrame = CFrame.new(hrp.Position, Vector3.new(targetPos.X, hrp.Position.Y, targetPos.Z))
end
end)
end
local function KYS_StartFlashlightSilentAim()
getgenv().KYS_FlashlightActivateRemote = KYS_GetFlashlightActivateRemote()
if KYS_FlashlightAimState.Connection then return end
KYS_FlashlightAimState.Connection = RunService.RenderStepped:Connect(KYS_FlashlightAimStep)
end
local function KYS_StopFlashlightSilentAim()
KYS_FlashlightAimState.Active = false
KYS_FlashlightAimState.FlashlightPart = nil
KYS_ClearFlashlightLaser()
if KYS_FlashlightAimState.Connection then
pcall(function() KYS_FlashlightAimState.Connection:Disconnect() end)
KYS_FlashlightAimState.Connection = nil
end
end
local function KYS_SetFlashlightSilentAim(enabled)
if enabled and false then
VD.FLASH_SilentAim = false
KYS_StopFlashlightSilentAim()
return
end
VD.FLASH_SilentAim = enabled and true or false
if VD.FLASH_SilentAim then
KYS_StartFlashlightSilentAim()
else
KYS_StopFlashlightSilentAim()
end
end
getgenv().KYS_SetFlashlightSilentAim = KYS_SetFlashlightSilentAim
getgenv().KYS_ClearFlashlightLaser = KYS_ClearFlashlightLaser
getgenv().KYS_SetFlashlightAimActive = function(active, flashlightPart)
KYS_FlashlightAimState.Active = active and true or false
if KYS_FlashlightAimState.Active and flashlightPart then
KYS_FlashlightAimState.FlashlightPart = flashlightPart
elseif not KYS_FlashlightAimState.Active then
KYS_FlashlightAimState.FlashlightPart = nil
end
if not KYS_FlashlightAimState.Active and KYS_FlashlightAimState.LaserBeam then
KYS_FlashlightAimState.LaserBeam.Transparency = 1
end
end
getgenv().KYS_FlashlightActivateRemote = KYS_GetFlashlightActivateRemote()
end)();
local VD_Parry = {
PreciseDistanceEnabled = true,
MaxDistance = 14,
CanParry = true,
IsParrying = false,
CooldownEndTime = 0,
KillerAnimator = nil,
KillerChar = nil,
KillerPlayer = nil,
Connections = {},
FiredTracks = {},
RenderConnection = nil,
LastStatus = "Off",
}
local VD_ParryAnimation = Instance.new("Animation")
VD_ParryAnimation.AnimationId = "rbxassetid://109133187196613"
local VD_ParryRange = Instance.new("CylinderHandleAdornment")
VD_ParryRange.Name = "KYS_ParryRange"
VD_ParryRange.Radius = VD.SURV_ParryDistance or 8
VD_ParryRange.InnerRadius = math.max(0.1, (VD.SURV_ParryDistance or 8) - 0.15)
VD_ParryRange.Height = 0.01
VD_ParryRange.Color3 = Color3.fromRGB(128, 128, 128)
VD_ParryRange.AlwaysOnTop = false
VD_ParryRange.Adornee = Workspace:FindFirstChildOfClass("Terrain")
VD_ParryRange.Transparency = 1
VD_ParryRange.Parent = GetSafeGuiParent()
local VD_ATTACK_ANIMS = {
["rbxassetid://113255068724446"] = true,
["rbxassetid://74968262036854"] = true,
["rbxassetid://110355011987939"] = true,
["rbxassetid://139369275981139"] = true,
["rbxassetid://132817836308238"] = true,
["rbxassetid://129784271201071"] = true,
["rbxassetid://133963973694098"] = true,
["rbxassetid://117042998468241"] = true,
["rbxassetid://105374834496520"] = true,
["rbxassetid://111920872708571"] = true,
["rbxassetid://78432063483146"] = true,
["rbxassetid://118907603246885"] = true,
["rbxassetid://138720291317243"] = true,
["rbxassetid://115244153053858"] = true,
["rbxassetid://130593238885843"] = true,
["rbxassetid://122812055447896"] = true,
["rbxassetid://78935059863801"] = true,
["rbxassetid://135002183282873"] = true,
["rbxassetid://121216847022485"] = true,
}
function VD_UpdateParryRange()
if not VD.SURV_ShowParryCircle or not VD.SURV_AutoParry then
VD_ParryRange.Transparency = 1
return
end
local char = LocalPlayer.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
if not root then
VD_ParryRange.Transparency = 1
return
end
local currentMaxDist = VD_Parry.PreciseDistanceEnabled and (VD.SURV_ParryDistance or 8) or VD_Parry.MaxDistance
VD_ParryRange.Transparency = 0.4
VD_ParryRange.Radius = currentMaxDist
VD_ParryRange.InnerRadius = math.max(0.1, currentMaxDist - 0.15)
local params = RaycastParams.new()
params.FilterDescendantsInstances = { char }
params.FilterType = Enum.RaycastFilterType.Exclude
local ray = Workspace:Raycast(root.Position, Vector3.new(0, -15, 0), params)
local groundPos = ray and ray.Position or (root.Position - Vector3.new(0, 3, 0))
VD_ParryRange.CFrame = CFrame.new(groundPos + Vector3.new(0, 0.05, 0)) * CFrame.Angles(math.pi / 2, 0, 0)
end
function VD_GetParryRemote()
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local items = remotes and remotes:FindFirstChild("Items")
local dagger = items and items:FindFirstChild("Parrying Dagger")
return dagger and dagger:FindFirstChild("parry")
end
function VD_RefreshLocalCombatCache()
local char = LocalPlayer.Character
Root = char and char:FindFirstChild("HumanoidRootPart") or Root
Humanoid = char and char:FindFirstChildOfClass("Humanoid") or Humanoid
end
local State = { ParryCooldown = false, ParryCooldownThread = nil }
local Attached = {}
function IsKiller(p) return p.Team and p.Team.Name == "Killer" end
function IsDowned(char) local hrp = char and char:FindFirstChild("HumanoidRootPart"); if not hrp then return true end; local state = char:GetAttribute("State"); return state == "Downed" or state == "Dead" end
function TriggerCrouch()
local startT = tick()
task.spawn(function()
local char = LocalPlayer.Character
if not char then return end
local humanoid = char:FindFirstChildOfClass("Humanoid")
-- Toggle crouch ON: replicate mobile SurvivorAnimationsController logic
pcall(function() char:SetAttribute("Crouching", true) end)
pcall(function() ReplicatedStorage.Remotes.Mechanics.ChangeAttribute:FireServer("Crouchingserver", true) end)
pcall(function() ReplicatedStorage.Remotes.Chase.Runevent:FireServer(char, false) end)
if humanoid then pcall(function() humanoid:ChangeState(Enum.HumanoidStateType.Landed) end) end
-- Also fire the mobile crouch button signal for visual sync
pcall(function()
local survMob = LocalPlayer:FindFirstChildOfClass("PlayerGui"):FindFirstChild("Survivor-mob")
if survMob then
local controls = survMob:FindFirstChild("Controls")
if controls then
local crouchBtn = controls:FindFirstChild("crouch")
if crouchBtn then
firesignal(crouchBtn.MouseButton1Click)
end
end
end
end)
while tick() - startT < 1.2 do
pcall(function() ReplicatedStorage.Remotes.Mechanics.ChangeAttribute:FireServer("Crouchingserver", true) end)
task.wait(0.1)
end
-- Toggle crouch OFF
pcall(function() char:SetAttribute("Crouching", false) end)
pcall(function() ReplicatedStorage.Remotes.Mechanics.ChangeAttribute:FireServer("Crouchingserver", false) end)
if humanoid then pcall(function() humanoid:ChangeState(Enum.HumanoidStateType.Landed) end) end
-- Fire crouch button again to toggle OFF visually
pcall(function()
local survMob = LocalPlayer:FindFirstChildOfClass("PlayerGui"):FindFirstChild("Survivor-mob")
if survMob then
local controls = survMob:FindFirstChild("Controls")
if controls then
local crouchBtn = controls:FindFirstChild("crouch")
if crouchBtn then
firesignal(crouchBtn.MouseButton1Click)
end
end
end
end)
end)
end
function IsSafeToParry(char) return not IsDowned(char) end
local player = LocalPlayer
-- ==================== AUTO PARRY SENSOR ====================
function tapMobileParryButton()
local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
if not playerGui then return end
local survivorMob = playerGui:FindFirstChild("Survivor-mob")
local parryBtn = survivorMob
and survivorMob:FindFirstChild("Controls")
and survivorMob.Controls:FindFirstChild("Gui-mob")
if parryBtn and parryBtn.Visible then
if firesignal then
pcall(function()
firesignal(parryBtn.MouseButton1Down)
task.wait(0.01)
firesignal(parryBtn.MouseButton1Up)
end)
end
else
pcall(function()
if mouse2click then
mouse2click()
return
end
if mouse2press and mouse2release then
mouse2press()
task.wait(0.01)
mouse2release()
return
end
if MouseButton2Click then
MouseButton2Click()
return
end
VirtualInputManager:SendMouseButtonEvent(0, 0, 1, true, game, 0)
task.wait(0.01)
VirtualInputManager:SendMouseButtonEvent(0, 0, 1, false, game, 0)
end)
end
end
function ExecuteParry()
if State.ParryCooldown then return end
pcall(function()
local parryRemote = game:GetService("ReplicatedStorage"):FindFirstChild("Remotes"):FindFirstChild("Items"):FindFirstChild("Parrying Dagger"):FindFirstChild("parry")
if parryRemote then
for i = 1, 10 do parryRemote:FireServer() end
end
task.spawn(tapMobileParryButton)
end)
end
function ListenToParryResult()
task.spawn(function()
local remotes = game:GetService("ReplicatedStorage"):WaitForChild("Remotes", 5)
local dagger = remotes and remotes:WaitForChild("Items", 5):WaitForChild("Parrying Dagger", 5)
local parryResultRemote = dagger and dagger:WaitForChild("parryResult", 5)
if parryResultRemote then
parryResultRemote.OnClientEvent:Connect(function(arg1, arg2)
local cdDur = tonumber(arg2) or ((arg1 == true) and 90 or 60)
State.ParryCooldown = true
if State.ParryCooldownThread then task.cancel(State.ParryCooldownThread) end
State.ParryCooldownThread = task.delay(cdDur, function()
State.ParryCooldown = false
end)
end)
end
end)
end
ListenToParryResult()
function AttachParrySensor(kChar)
if not kChar or Attached[kChar] then return end
Attached[kChar] = true
local humanoid = kChar:FindFirstChild("Humanoid")
if not humanoid then
humanoid = kChar:WaitForChild("Humanoid", 5)
if not humanoid then return end
end
local animator = humanoid:FindFirstChildOfClass("Animator")
if not animator then
animator = humanoid:WaitForChild("Animator", 5)
if not animator then return end
end
humanoid.ChildAdded:Connect(function(child)
if child:IsA("Animator") then
Attached[kChar] = nil
AttachParrySensor(kChar)
end
end)
kChar.AncestryChanged:Connect(function(_, parent)
if not parent then
Attached[kChar] = nil
end
end)
animator.AnimationPlayed:Connect(function(track)
local animId = track.Animation and track.Animation.AnimationId or ""
local id = animId:match("%d+")
-- Auto Crouch untuk Abyssal S1
if id == "80411309607666" and VD.AutoCrouch then
local myChar = LocalPlayer.Character
if IsDowned(myChar) then return end
local myHRP = myChar and myChar:FindFirstChild("HumanoidRootPart")
local kHRP = kChar:FindFirstChild("HumanoidRootPart")
if myHRP and kHRP then
local dist = (myHRP.Position - kHRP.Position).Magnitude
if dist <= 40 then
TriggerCrouch()
end
end
return
end
local attackName = VD_ATTACK_ANIMS[animId]
if not attackName then return end
if not VD.SURV_AutoParry then return end
if State.ParryCooldown then return end
if VD.Ignored_Skills_List and VD.Ignored_Skills_List[attackName] then return end
local myChar = LocalPlayer.Character
if IsDowned(myChar) or not IsSafeToParry(myChar) then return end
local myHRP = myChar and myChar:FindFirstChild("HumanoidRootPart")
local kHRP = kChar:FindFirstChild("HumanoidRootPart")
if not myHRP or not kHRP then return end
local delta = myHRP.Position - kHRP.Position
local startDistance = delta.Magnitude
if VD.SURV_ParryAggressive then
local aggressiveRadius = 12
local detectionRadius = VD.SURV_ParryDistance + 5
if startDistance > detectionRadius then return end
if startDistance <= aggressiveRadius then
ExecuteParry()
else
local tracker
local startTime = os.clock()
tracker = RunService.Heartbeat:Connect(function()
if os.clock() - startTime >= 1.5 or State.ParryCooldown or not myHRP or not kHRP or IsDowned(myChar) then
if tracker then tracker:Disconnect() end
return
end
local currentDist = (myHRP.Position - kHRP.Position).Magnitude
if currentDist <= aggressiveRadius then
ExecuteParry()
if tracker then tracker:Disconnect() end
end
end)
end
else
if startDistance > VD.SURV_ParryDistance then return end
local myPosFlat = Vector3.new(myHRP.Position.X, 0, myHRP.Position.Z)
local kPosFlat = Vector3.new(kHRP.Position.X, 0, kHRP.Position.Z)
local flatDelta = myPosFlat - kPosFlat
if flatDelta.Magnitude > 0 then
local flatDirection = flatDelta.Unit
local kLookFlat = Vector3.new(kHRP.CFrame.LookVector.X, 0, kHRP.CFrame.LookVector.Z).Unit
local isFacing = kLookFlat:Dot(flatDirection)
if isFacing < 0.6 then return end
end
ExecuteParry()
end
end)
end
function TryAttach(p)
if p ~= player and IsKiller(p) and p.Character then
AttachParrySensor(p.Character)
end
end
function SetupPlayer(p)
if p == player then return end
p.CharacterAdded:Connect(function() TryAttach(p) end)
p:GetPropertyChangedSignal("Team"):Connect(function() TryAttach(p) end)
if p.Character then TryAttach(p) end
end
-- Setup Parry Sensor
for _, p in pairs(Players:GetPlayers()) do
SetupPlayer(p)
end
Players.PlayerAdded:Connect(SetupPlayer)
task.spawn(function()
while true do
task.wait(5)
for _, p in pairs(Players:GetPlayers()) do
TryAttach(p)
end
end
end)
function VD_SetAutoParry(state)
VD.SURV_AutoParry = state == true
if VD.SURV_AutoParry then
if not _G.VD_ParryRenderConnection then
_G.VD_ParryRenderConnection = game:GetService('RunService').RenderStepped:Connect(function()
if type(VD_UpdateParryRange) == 'function' then VD_UpdateParryRange() end
end)
end
else
if typeof(VD_ParryRange) == 'Instance' then VD_ParryRange.Transparency = 1 end
if _G.VD_ParryRenderConnection then
_G.VD_ParryRenderConnection:Disconnect()
_G.VD_ParryRenderConnection = nil
end
end
end
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
local AutoSkill = {
LastGoalRotation = nil,
HasClickedThisGoal = false,
LastLineRotation = nil,
LastTick = nil,
WasActive = false,
PerfectLastGoalRotation = nil,
PerfectHasClickedThisGoal = false,
PerfectLastLineRotation = nil,
PerfectLastTick = nil,
PerfectWasActive = false,
InstantLastTriggerTick = 0,
InstantLastGoalRotation = 0,
InstantLastGoalInstance = nil,
InstantCurrentGoalID = 0,
InstantHasClicked = false,
InstantForcingRotation = false,
InstantRotationConnection = nil,
}
function VD_PressSkill()
if isMobile then
local btn = PlayerGui:FindFirstChild("check", true)
if btn and btn:IsA("GuiObject") then
local pos = btn.AbsolutePosition
local size = btn.AbsoluteSize
local inset = GuiService:GetGuiInset()
local x = pos.X + (size.X / 2) + inset.X
local y = pos.Y + (size.Y / 2) + inset.Y
pcall(function() VirtualInputManager:SendTouchEvent(8822, Enum.UserInputState.Begin.Value, x, y) end)
task.wait(0.01)
pcall(function() VirtualInputManager:SendTouchEvent(8822, Enum.UserInputState.End.Value, x, y) end)
pcall(function()
if firesignal and btn.MouseButton1Click then
firesignal(btn.MouseButton1Click)
end
end)
end
else
pcall(function() VirtualInputManager:SendKeyEvent(true, Enum.KeyCode.Space, false, game) end)
task.wait(0.01)
pcall(function() VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.Space, false, game) end)
end
end
function VD_GetSkillCheck()
for _, guiName in ipairs({ "SkillCheckPromptGui", "SkillCheckPromptGui-con" }) do
local gui = PlayerGui:FindFirstChild(guiName, true)
if gui then
local check = gui:FindFirstChild("Check", true)
if check and check.Visible then
local line = check:FindFirstChild("Line", true)
local goal = check:FindFirstChild("Goal", true)
if line and goal then return line, goal end
end
end
end
end
function VD_AngularDelta(from, to)
local d = to - from
if d > 180 then d = d - 360 end
if d < -180 then d = d + 360 end
return d
end
function VD_CrossedZone(prevLr, lr, startPos, endPos)
local function inZone(r)
if startPos > endPos then
return r >= startPos or r <= endPos
end
return r >= startPos and r <= endPos
end
if inZone(lr) then return true end
if prevLr == nil then return false end
local delta = VD_AngularDelta(prevLr, lr)
local steps = math.abs(math.floor(delta))
if steps < 2 then return false end
local stepSize = delta / steps
for i = 1, steps do
if inZone((prevLr + stepSize * i) % 360) then return true end
end
return false
end
function VD_NormalSkillcheckUpdate()
local line, goal = VD_GetSkillCheck()
if not (line and goal) then
AutoSkill.LastGoalRotation = nil
AutoSkill.HasClickedThisGoal = false
AutoSkill.LastLineRotation = nil
AutoSkill.LastTick = nil
AutoSkill.WasActive = false
return
end
local lr = line.Rotation % 360
local gr = goal.Rotation % 360
local now = os.clock()
if not AutoSkill.WasActive then
AutoSkill.WasActive = true
AutoSkill.HasClickedThisGoal = false
AutoSkill.LastGoalRotation = gr
AutoSkill.LastLineRotation = lr
AutoSkill.LastTick = now
return
end
if AutoSkill.LastGoalRotation and math.abs(VD_AngularDelta(AutoSkill.LastGoalRotation, gr)) > 5 then
AutoSkill.HasClickedThisGoal = false
AutoSkill.LastLineRotation = nil
AutoSkill.LastTick = nil
end
AutoSkill.LastGoalRotation = gr
if AutoSkill.HasClickedThisGoal then
AutoSkill.LastLineRotation = lr
AutoSkill.LastTick = now
return
end
if AutoSkill.LastLineRotation and AutoSkill.LastTick then
local dt = now - AutoSkill.LastTick
if dt > 0 then
local lineSpeed = VD_AngularDelta(AutoSkill.LastLineRotation, lr) / dt
local predicted = (lr + lineSpeed * dt * 0) % 360
if VD_CrossedZone(AutoSkill.LastLineRotation, predicted, (gr + 104) % 360, (gr + 109) % 360) then
AutoSkill.HasClickedThisGoal = true
task.spawn(function()
task.wait(0.03)
VD_PressSkill()
end)
end
end
end
AutoSkill.LastLineRotation = lr
AutoSkill.LastTick = now
end
function VD_PerfectSkillcheckUpdate()
local line, goal = VD_GetSkillCheck()
if not (line and goal) then
AutoSkill.PerfectLastGoalRotation = nil
AutoSkill.PerfectHasClickedThisGoal = false
AutoSkill.PerfectLastLineRotation = nil
AutoSkill.PerfectLastTick = nil
AutoSkill.PerfectWasActive = false
return
end
local lr = line.Rotation % 360
local gr = goal.Rotation % 360
local now = os.clock()
if not AutoSkill.PerfectWasActive then
AutoSkill.PerfectWasActive = true
AutoSkill.PerfectHasClickedThisGoal = false
AutoSkill.PerfectLastGoalRotation = gr
AutoSkill.PerfectLastLineRotation = lr
AutoSkill.PerfectLastTick = now
return
end
if AutoSkill.PerfectLastGoalRotation and math.abs(VD_AngularDelta(AutoSkill.PerfectLastGoalRotation, gr)) > 5 then
AutoSkill.PerfectHasClickedThisGoal = false
AutoSkill.PerfectLastLineRotation = nil
AutoSkill.PerfectLastTick = nil
end
AutoSkill.PerfectLastGoalRotation = gr
if AutoSkill.PerfectHasClickedThisGoal then
AutoSkill.PerfectLastLineRotation = lr
AutoSkill.PerfectLastTick = now
return
end
if AutoSkill.PerfectLastLineRotation and AutoSkill.PerfectLastTick then
local dt = now - AutoSkill.PerfectLastTick
if dt > 0 then
local lineSpeed = VD_AngularDelta(AutoSkill.PerfectLastLineRotation, lr) / dt
local predicted = (lr + lineSpeed * dt * 0) % 360
if VD_CrossedZone(AutoSkill.PerfectLastLineRotation, predicted, (gr + 104) % 360, (gr + 108) % 360) then
AutoSkill.PerfectHasClickedThisGoal = true
VD_PressSkill()
end
end
end
AutoSkill.PerfectLastLineRotation = lr
AutoSkill.PerfectLastTick = now
end
function VD_InstantSkillcheckUpdate()
if AutoSkill.InstantHasClicked then return end
-- Exact Fallens.lua logic: non-recursive FindFirstChild
local prompt = PlayerGui:FindFirstChild("SkillCheckPromptGui")
if not prompt then
prompt = PlayerGui:FindFirstChild("SkillCheckPromptGui-con")
end
if not prompt then return end
local check = prompt:FindFirstChild("Check")
if not check or not check.Visible then return end
local line = check:FindFirstChild("Line")
local goal = check:FindFirstChild("Goal")
if not line or not goal then return end
-- Exact Fallens.lua logic: raw rotation WITHOUT modulo
line.Rotation = goal.Rotation + 109
AutoSkill.InstantHasClicked = true
task.spawn(function()
VD_PressSkill()
task.wait(0.2)
AutoSkill.InstantHasClicked = false
end)
end
RunService.RenderStepped:Connect(function()
if not VD.AutoSkillcheck then return end
if VD.AutoSkillcheckMode == "Perfect" then
VD_PerfectSkillcheckUpdate()
elseif VD.AutoSkillcheckMode == "Instant" then
VD_InstantSkillcheckUpdate()
else
VD_NormalSkillcheckUpdate()
end
end)
function VD_SetAutoSkillcheck(state)
VD.AutoSkillcheck = state == true
if not VD.AutoSkillcheck then
if AutoSkill.InstantRotationConnection then
AutoSkill.InstantRotationConnection:Disconnect()
AutoSkill.InstantRotationConnection = nil
end
AutoSkill.InstantHasClicked = false
AutoSkill.WasActive = false
AutoSkill.PerfectWasActive = false
VD_Notify("Auto Skillcheck", "Disabled", 2)
else
VD_Notify("Auto Skillcheck", "Enabled (" .. tostring(VD.AutoSkillcheckMode or "Normal") .. " Mode)", 2)
end
end
-- =====================================================
-- INSTANT HEAL & AUTO HEAL ALL
-- =====================================================
InstantHealSelf = false
AutoHealAll = false
AutoSelfUnhook = false
GodFlashlight = false
AutoHealAllConnection = nil
InstantHealConnection = nil
AutoSelfUnhookConnection = nil
GodFlashlightConnection = nil
function doSelfHeal()
local char = LocalPlayer.Character
if not char then return end
local skillCheckRemote = ReplicatedStorage.Remotes.Healing.SkillCheckResultEvent
pcall(function() skillCheckRemote:FireServer("success", 100, char) end)
end
function doSelfHealTrue()
local char = LocalPlayer.Character
if not char then return end
local healRemote = ReplicatedStorage.Remotes.Healing.HealEvent
local hrp = char:FindFirstChild("HumanoidRootPart")
if not hrp then return end
pcall(function() healRemote:FireServer(hrp, true) end)
end
function doSelfHealFalse()
local char = LocalPlayer.Character
if not char then return end
local healRemote = ReplicatedStorage.Remotes.Healing.HealEvent
local hrp = char:FindFirstChild("HumanoidRootPart")
if not hrp then return end
pcall(function() healRemote:FireServer(hrp, false) end)
end
function doOthersHealSkillCheck(targetPlayer)
if not targetPlayer or not targetPlayer.Character then return end
local skillCheckRemote = ReplicatedStorage.Remotes.Healing.SkillCheckResultEvent
pcall(function() skillCheckRemote:FireServer("success", 100, targetPlayer.Character) end)
end
function doOthersHealTrue(targetPlayer)
if not targetPlayer or not targetPlayer.Character then return end
local targetHRP = targetPlayer.Character:FindFirstChild("HumanoidRootPart")
if not targetHRP then return end
local healRemote = ReplicatedStorage.Remotes.Healing.HealEvent
pcall(function() healRemote:FireServer(targetHRP, true) end)
end
function doOthersHealFalse(targetPlayer)
if not targetPlayer or not targetPlayer.Character then return end
local targetHRP = targetPlayer.Character:FindFirstChild("HumanoidRootPart")
if not targetHRP then return end
local healRemote = ReplicatedStorage.Remotes.Healing.HealEvent
pcall(function() healRemote:FireServer(targetHRP, false) end)
end
function setInstantHealSelf(v)
InstantHealSelf = v
if v then
local healActive = false
if InstantHealConnection then InstantHealConnection:Disconnect() end
InstantHealConnection = RunService.Heartbeat:Connect(function(dt)
if not InstantHealSelf then return end
local myChar = LocalPlayer.Character
local myHum = myChar and myChar:FindFirstChildOfClass("Humanoid")
if not myHum then return end
if myHum.Health >= myHum.MaxHealth * 0.9 then
-- Auto stop heal when HP is full
if healActive then
healActive = false
doSelfHealFalse()
end
return
end
-- Check if game cancelled our heal (e.g. player moved)
if healActive then
local checkScript = myChar:FindFirstChild("CheckInterractable")
if checkScript and not checkScript:GetAttribute("isHealing") then
-- Game cancelled our heal, reset so we can restart
healActive = false
end
end
-- Start heal (or restart after being cancelled)
if not healActive then
healActive = true
doSelfHealTrue()
end
end)
else
if InstantHealConnection then InstantHealConnection:Disconnect(); InstantHealConnection = nil end
-- Send stop heal just in case
pcall(doSelfHealFalse)
end
end
function setAutoHealAll(v)
AutoHealAll = v
if v then
local activeHeals = {} -- [player] = true if we're currently healing them
if AutoHealAllConnection then AutoHealAllConnection:Disconnect() end
AutoHealAllConnection = RunService.Heartbeat:Connect(function(dt)
if not AutoHealAll then return end
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Character then
local hrp = player.Character:FindFirstChild("HumanoidRootPart")
local hum = player.Character:FindFirstChildOfClass("Humanoid")
if hum and hum.Health > 0 and hum.Health < hum.MaxHealth * 0.9 and hrp then
-- Check if game cancelled our heal on this player (e.g. we or they moved)
if activeHeals[player] then
local myChar = LocalPlayer.Character
local checkScript = myChar and myChar:FindFirstChild("CheckInterractable")
if checkScript and not checkScript:GetAttribute("isHealing") then
activeHeals[player] = nil
end
end
-- Start healing this player if not already
if not activeHeals[player] then
activeHeals[player] = true
doOthersHealTrue(player)
end
else
-- Stop healing if HP is full or dead
if activeHeals[player] then
activeHeals[player] = nil
doOthersHealFalse(player)
end
end
else
-- Player left or no character
if activeHeals[player] then
activeHeals[player] = nil
pcall(function() doOthersHealFalse(player) end)
end
end
end
end)
else
if AutoHealAllConnection then AutoHealAllConnection:Disconnect(); AutoHealAllConnection = nil end
end
end
-- =====================================================
-- GEN BOOST BYPASS
-- =====================================================
GenBypass = {
Enabled = false,
Button = nil,
UI = nil,
Cache = {},
CacheTimer = 0,
Processed = {},
HotkeyCode = Enum.KeyCode.G,
}
function GB_GetAllGenerators()
local now = tick()
if now - GenBypass.CacheTimer < 5 then return GenBypass.Cache end
GenBypass.Cache = {}
GenBypass.CacheTimer = now
local mapFolder = workspace:FindFirstChild("Map")
if not mapFolder then return GenBypass.Cache end
pcall(function()
for _, v in pairs(mapFolder:GetDescendants()) do
if not v:IsA("Model") then continue end
if v.Name ~= "Generator" then continue end
local isReal = v:GetAttribute("RepairProgress") ~= nil
or v:GetAttribute("kickcount") ~= nil
or v:GetAttribute("ProgressRepair") ~= nil
if isReal then table.insert(GenBypass.Cache, v) end
end
end)
return GenBypass.Cache
end
function GB_GetPoints(genModel)
local points = {}
pcall(function()
for _, obj in pairs(genModel:GetChildren()) do
if obj.Name:find("GeneratorPoint") and obj:IsA("BasePart") then
table.insert(points, obj)
end
end
end)
return points
end
function GB_WaitRepairing(point, timeout)
local start = tick()
while tick() - start < (timeout or 1) do
if point:GetAttribute("IsRepairing") == true then return true end
task.wait(0.05)
end
return false
end
function GB_DoRepair(targetPoint)
local genModel = targetPoint.Parent
if GenBypass.Processed[genModel] then return end
GenBypass.Processed[genModel] = true
local character = LocalPlayer.Character
local hrp = character and character:FindFirstChild("HumanoidRootPart")
if not hrp then GenBypass.Processed[genModel] = nil return end
local RepairEvent = ReplicatedStorage:FindFirstChild("Remotes")
and ReplicatedStorage.Remotes:FindFirstChild("Generator")
and ReplicatedStorage.Remotes.Generator:FindFirstChild("RepairEvent")
local originalCFrame = hrp.CFrame
pcall(function()
for _, point in pairs(GB_GetPoints(genModel)) do
if point ~= targetPoint and point.Parent then
hrp.Anchored = true
hrp.CFrame = point.CFrame
task.wait(0.15)
pcall(function() if RepairEvent then RepairEvent:FireServer(point, true) end end)
if not GB_WaitRepairing(point, 0.8) then
pcall(function() if RepairEvent then RepairEvent:FireServer(point, false) end end)
task.wait(0.1)
hrp.CFrame = point.CFrame
task.wait(0.15)
pcall(function() if RepairEvent then RepairEvent:FireServer(point, true) end end)
GB_WaitRepairing(point, 0.5)
end
hrp.Anchored = false
task.wait(0.05)
end
end
end)
pcall(function()
if hrp and hrp.Parent then
hrp.Anchored = false
hrp.CFrame = originalCFrame
end
end)
task.wait(0.1)
pcall(function() if RepairEvent then RepairEvent:FireServer(targetPoint, false) end end)
end
function GB_GetNearestPoint()
local character = LocalPlayer.Character
local hrp = character and character:FindFirstChild("HumanoidRootPart")
if not hrp then return nil end
local bestPoint, bestDist = nil, math.huge
for _, gen in pairs(GB_GetAllGenerators()) do
for _, point in pairs(GB_GetPoints(gen)) do
local d = (hrp.Position - point.Position).Magnitude
if d < bestDist then bestDist = d; bestPoint = point end
end
end
return bestPoint, bestDist
end
function GB_IsPromptVisible()
local ok, frame = pcall(function()
return LocalPlayer.PlayerGui.pcprompts.Frame.GeneratorRepair
end)
return ok and frame and frame.Visible
end
function GB_UpdateButton()
if GenBypass.Button then
GenBypass.Button.Visible = GenBypass.Enabled and isMobile
end
end
function GB_CreateButton()
local oldUI = LocalPlayer.PlayerGui:FindFirstChild("BypassGenUI")
if oldUI then oldUI:Destroy() end
GenBypass.UI = Instance.new("ScreenGui")
GenBypass.UI.Name = "BypassGenUI"
GenBypass.UI.ResetOnSpawn = false
GenBypass.UI.IgnoreGuiInset = true
GenBypass.UI.Parent = LocalPlayer:WaitForChild("PlayerGui")
GenBypass.Button = Instance.new("ImageButton")
GenBypass.Button.Name = "BypassGenButton"
GenBypass.Button.Size = UDim2.new(0, 60, 0, 60)
GenBypass.Button.Position = UDim2.new(0.88, 0, 0.55, 0)
GenBypass.Button.AnchorPoint = Vector2.new(0.5, 0.5)
GenBypass.Button.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
GenBypass.Button.BackgroundTransparency = 0.15
GenBypass.Button.AutoButtonColor = true
GenBypass.Button.Visible = false
GenBypass.Button.ZIndex = 10
GenBypass.Button.Parent = GenBypass.UI
Instance.new("UICorner", GenBypass.Button).CornerRadius = UDim.new(1, 0)
local s = Instance.new("UIStroke", GenBypass.Button)
s.Color = Color3.fromRGB(255, 255, 255)
s.Thickness = 2; s.Transparency = 0.2
local lbl = Instance.new("TextLabel", GenBypass.Button)
lbl.Size = UDim2.new(1, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = "BYPASS"
lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
lbl.TextScaled = true
lbl.Font = Enum.Font.GothamBlack
lbl.ZIndex = 11
local function applyShine(obj, baseColor)
local grad = Instance.new("UIGradient", obj)
grad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, baseColor),
ColorSequenceKeypoint.new(0.4, baseColor),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(255, 255, 255)),
ColorSequenceKeypoint.new(0.6, baseColor),
ColorSequenceKeypoint.new(1, baseColor)
})
grad.Rotation = 45
grad.Offset = Vector2.new(-1, -1)
task.spawn(function()
local TweenService = game:GetService("TweenService")
local ti = TweenInfo.new(2, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1)
local tw = TweenService:Create(grad, ti, { Offset = Vector2.new(1, 1) })
tw:Play()
end)
end
applyShine(GenBypass.Button, Color3.fromRGB(20, 0, 30))
applyShine(lbl, Color3.fromRGB(255, 0, 255))
applyShine(s, Color3.fromRGB(255, 0, 255))
GenBypass.Button.MouseButton1Click:Connect(function()
if not GenBypass.Enabled then return end
local bestPoint, bestDist = GB_GetNearestPoint()
if bestPoint and bestDist <= 8 then GB_DoRepair(bestPoint) end
end)
end
GB_CreateButton()
LocalPlayer.CharacterAdded:Connect(function()
task.wait(0.5)
GB_CreateButton()
GB_UpdateButton()
end)
UserInputService.InputBegan:Connect(function(input, gp)
if gp then return end
if isMobile then return end
if input.KeyCode == GenBypass.HotkeyCode and GenBypass.Enabled then
if not GB_IsPromptVisible() then return end
local bestPoint, bestDist = GB_GetNearestPoint()
if not bestPoint or bestDist > 8 then return end
if GenBypass.Processed[bestPoint.Parent] then return end
GB_DoRepair(bestPoint)
end
end)
UserInputService.InputBegan:Connect(function(input, gp)
if gp then return end
if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
if not GenBypass.Enabled then return end
if not GB_IsPromptVisible() then return end
local bestPoint, bestDist = GB_GetNearestPoint()
if not bestPoint or bestDist > 8 then return end
if GenBypass.Processed[bestPoint.Parent] then return end
GB_DoRepair(bestPoint)
end)
task.spawn(function()
while true do
task.wait(2)
local hrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
if hrp then
for genModel in pairs(GenBypass.Processed) do
if not genModel or not genModel.Parent then
GenBypass.Processed[genModel] = nil
continue
end
local nearAny = false
for _, point in pairs(GB_GetPoints(genModel)) do
if point.Parent and (hrp.Position - point.Position).Magnitude <= 10 then
nearAny = true; break
end
end
if not nearAny then GenBypass.Processed[genModel] = nil end
end
end
end
end)
function setGenBypass(v)
GenBypass.Enabled = v
GB_UpdateButton()
end
function setAutoCrouch(v) VD.AutoCrouch = v end
-- =====================================================
-- INF GRAB (MYERS)
-- =====================================================
MyersGrabData = {
Enabled = false,
UI = nil,
Button = nil,
DragLocked = false,
Dragging = false,
DragStart = nil,
DragStartPos = nil,
HotkeyCode = Enum.KeyCode.H,
}
function getMyersTarget()
local char = LocalPlayer.Character
if not char then return nil end
local myHRP = char:FindFirstChild("HumanoidRootPart")
if not myHRP then return nil end
local candidates = {}
for _, player in ipairs(game:GetService("Players"):GetPlayers()) do
if player ~= LocalPlayer and player.Character then
local hrp = player.Character:FindFirstChild("HumanoidRootPart")
local hum = player.Character:FindFirstChildOfClass("Humanoid")
if hrp and hum and hum.Health > 0 then
table.insert(candidates, {
player = player,
dist = (hrp.Position - myHRP.Position).Magnitude,
health = hum.Health
})
end
end
end
table.sort(candidates, function(a, b) return a.dist < b.dist end)
for _, c in ipairs(candidates) do
return c.player
end
return nil
end
function doMyersGrab()
if not MyersGrabData.Enabled then return end
local target = getMyersTarget()
if not target or not target.Character then return end
pcall(function()
local ReplicatedStorage = game:GetService("ReplicatedStorage")
ReplicatedStorage.Remotes.Killers.Stalker.grab:FireServer(target.Character)
end)
end
function setupMyersGrabBtn()
local oldUI = LocalPlayer.PlayerGui:FindFirstChild("MyersGrabUI")
if oldUI then oldUI:Destroy() end
MyersGrabData.UI = Instance.new("ScreenGui")
MyersGrabData.UI.Name = "MyersGrabUI"
MyersGrabData.UI.ResetOnSpawn = false
MyersGrabData.UI.IgnoreGuiInset = true
MyersGrabData.UI.Parent = LocalPlayer:WaitForChild("PlayerGui")
MyersGrabData.Button = Instance.new("ImageButton")
MyersGrabData.Button.Name = "MyersGrabButton"
MyersGrabData.Button.Size = UDim2.new(0, 60, 0, 60)
MyersGrabData.Button.Position = UDim2.new(0.7, 0, 0.75, 0)
MyersGrabData.Button.AnchorPoint = Vector2.new(0.5, 0.5)
MyersGrabData.Button.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
MyersGrabData.Button.BackgroundTransparency = 0.15
MyersGrabData.Button.AutoButtonColor = true
MyersGrabData.Button.Visible = false
MyersGrabData.Button.ZIndex = 10
MyersGrabData.Button.Parent = MyersGrabData.UI
Instance.new("UICorner", MyersGrabData.Button).CornerRadius = UDim.new(1, 0)
local s = Instance.new("UIStroke", MyersGrabData.Button)
s.Color = Color3.fromRGB(255, 255, 255)
s.Thickness = 2; s.Transparency = 0.2
local lbl = Instance.new("TextLabel", MyersGrabData.Button)
lbl.Size = UDim2.new(1, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = "GRAB"
lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
lbl.TextScaled = true
lbl.Font = Enum.Font.GothamBlack
lbl.ZIndex = 11
local function applyShine(obj, baseColor)
local grad = Instance.new("UIGradient", obj)
grad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, baseColor),
ColorSequenceKeypoint.new(0.4, baseColor),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(255, 255, 255)),
ColorSequenceKeypoint.new(0.6, baseColor),
ColorSequenceKeypoint.new(1, baseColor)
})
grad.Rotation = 45
grad.Offset = Vector2.new(-1, -1)
task.spawn(function()
local TweenService = game:GetService("TweenService")
local ti = TweenInfo.new(2, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1)
local tw = TweenService:Create(grad, ti, { Offset = Vector2.new(1, 1) })
tw:Play()
end)
end
applyShine(MyersGrabData.Button, Color3.fromRGB(20, 0, 30))
applyShine(lbl, Color3.fromRGB(255, 0, 255))
applyShine(s, Color3.fromRGB(255, 0, 255))
MyersGrabData.Button.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
if MyersGrabData.DragLocked then return end
MyersGrabData.Dragging = true
MyersGrabData.DragStart = input.Position
MyersGrabData.DragStartPos = MyersGrabData.Button.Position
end
end)
game:GetService("UserInputService").InputChanged:Connect(function(input)
if MyersGrabData.Dragging and not MyersGrabData.DragLocked and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - MyersGrabData.DragStart
MyersGrabData.Button.Position = UDim2.new(
MyersGrabData.DragStartPos.X.Scale, MyersGrabData.DragStartPos.X.Offset + delta.X,
MyersGrabData.DragStartPos.Y.Scale, MyersGrabData.DragStartPos.Y.Offset + delta.Y
)
end
end)
MyersGrabData.Button.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
MyersGrabData.Dragging = false
end
end)
MyersGrabData.Button.MouseButton1Click:Connect(doMyersGrab)
end
setupMyersGrabBtn()
LocalPlayer.CharacterAdded:Connect(function()
task.wait(0.5)
setupMyersGrabBtn()
if MyersGrabData.Button then
MyersGrabData.Button.Visible = MyersGrabData.Enabled
end
end)
game:GetService("UserInputService").InputBegan:Connect(function(input, gp)
if gp then return end
if input.KeyCode == MyersGrabData.HotkeyCode and MyersGrabData.Enabled then
doMyersGrab()
end
end)
function setMyersGrab(v)
MyersGrabData.Enabled = v
if MyersGrabData.Button then
MyersGrabData.Button.Visible = v
end
end
function setMyersDragLocked(v)
MyersGrabData.DragLocked = v
end
-- =====================================================
-- VEIL AIMBOT (PREDICTION)
-- =====================================================
VeilConfig = {
Enabled = false,
ShowFOV = true,
ShowTargetLaser = true,
FOV = 150,
SpearSpeed = 165,
Gravity = workspace.Gravity * 0.5,
MaxDist = 200,
AutoPredict = false,
TargetPart = "Torso",
HorizontalPredictFactor = 1.0,
}
VeilState = {
chargingSpear = false,
touchInput = nil,
attackCooldown = false,
passiveCooldown = false,
remoteHooked = false,
lastPredictedPos = nil,
}
VeilVelocityCache = {}
VeilDraw = {
FOVCircle = Drawing.new("Circle"),
Highlight = Instance.new("Highlight"),
Tracer = Drawing.new("Circle"),
}
VeilDraw.FOVCircle.Color = Color3.fromRGB(255, 0, 255)
VeilDraw.FOVCircle.Thickness = 1.5
VeilDraw.FOVCircle.Filled = false
VeilDraw.FOVCircle.Visible = false
VeilDraw.Highlight.Name = "VD_VeilTarget"
VeilDraw.Highlight.FillColor = Color3.fromRGB(255, 0, 0)
VeilDraw.Highlight.OutlineColor = Color3.fromRGB(255, 255, 255)
VeilDraw.Highlight.FillTransparency = 0.5
VeilDraw.Highlight.OutlineTransparency = 0
VeilDraw.Tracer.Thickness = 2
VeilDraw.Tracer.Radius = 5
VeilDraw.Tracer.Color = Color3.fromRGB(255, 0, 255)
VeilDraw.Tracer.Filled = true
VeilDraw.Tracer.Visible = false
function Veil_GetRealVelocity(part, playerName)
if not part then return Vector3.zero end
local currentPos = part.Position
local currentTime = tick()
if not VeilVelocityCache[playerName] then
VeilVelocityCache[playerName] = {lastPos = currentPos, lastTime = currentTime, velocity = Vector3.zero}
return Vector3.zero
end
local cache = VeilVelocityCache[playerName]
local dt = currentTime - cache.lastTime
if dt > 0.01 then
local rawVelocity = (currentPos - cache.lastPos) / dt
if rawVelocity.Magnitude < 100 then
cache.velocity = cache.velocity:Lerp(rawVelocity, 0.4)
end
end
cache.lastPos = currentPos
cache.lastTime = currentTime
return cache.velocity
end
function veil_getTargetPart(char)
if VeilConfig.TargetPart == "Head" then
return char:FindFirstChild("Head")
elseif VeilConfig.TargetPart == "Root" then
return char:FindFirstChild("HumanoidRootPart")
else
return char:FindFirstChild("Torso")
or char:FindFirstChild("UpperTorso")
or char:FindFirstChild("HumanoidRootPart")
end
end
function veil_getClosestSurvivor()
local myChar = LocalPlayer.Character
local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart")
if not myRoot then return nil end
local cam = workspace.CurrentCamera
local center = Vector2.new(cam.ViewportSize.X / 2, cam.ViewportSize.Y / 2)
local bestDist = VeilConfig.FOV
local bestTarget = nil
for _, p in ipairs(game:GetService("Players"):GetPlayers()) do
if p ~= LocalPlayer and p.Team and p.Team.Name == "Survivors" and p.Character then
local char = p.Character
local hum = char:FindFirstChildOfClass("Humanoid")
local part = veil_getTargetPart(char)
if hum and hum.Health > 0 and part then
local dist3D = (part.Position - myRoot.Position).Magnitude
if dist3D <= VeilConfig.MaxDist then
local screenPos, onScreen = cam:WorldToViewportPoint(part.Position)
if onScreen then
local dist2D = (Vector2.new(screenPos.X, screenPos.Y) - center).Magnitude
if dist2D < bestDist then
bestDist = dist2D
bestTarget = { Player = p, Part = part }
end
end
end
end
end
end
return bestTarget
end
function veil_setupInterceptor()
if VeilState.remoteHooked then return end
task.spawn(function()
pcall(function()
local oldNamecall
oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
local args = {...}
local method = getnamecallmethod()
if not checkcaller() then
if string.lower(method) == "kick" then
return nil
end
if method == "GetAttribute" then
if args[1] == "LakeMist" and VD.KILLER_InfLakeMist then
local caller = getcallingscript()
if caller and caller.Name == "AwardLog" then return 0 end
return false
end
if args[1] == "Pursuit" and VD.KILLER_InfPursuit then
local caller = getcallingscript()
if caller and caller.Name == "AwardLog" then return 0 end
return false
end
end
if method == "GetAttributes" then
if VD.KILLER_InfLakeMist or VD.KILLER_InfPursuit then
local attrs = oldNamecall(self, ...)
if type(attrs) == "table" then
local caller = getcallingscript()
if caller and caller.Name == "AwardLog" then
if VD.KILLER_InfLakeMist then attrs.LakeMist = 0 end
if VD.KILLER_InfPursuit then attrs.Pursuit = 0 end
else
if VD.KILLER_InfLakeMist then attrs.LakeMist = false end
if VD.KILLER_InfPursuit then attrs.Pursuit = false end
end
return attrs
end
end
end
if method == "FireServer" then
if self.Name == "Spearthrow" and VeilConfig.Enabled then
return nil
end
if VD.KILLER_InfLakeMist and self.Name == "LakeMist" then
local a1 = args[1]
if a1 == false then
return nil
elseif a1 == true then
task.delay(0.2, function()
pcall(function()
local c = game:GetService("Players").LocalPlayer.Character
if c and c:GetAttribute("action") == true then
c:SetAttribute("action", false)
end
end)
end)
end
end
if VD.KILLER_InfPursuit and self.Name == "Pursuit" then
local a1 = args[1]
if a1 == false then
return nil
elseif a1 == true then
task.delay(0.2, function()
pcall(function()
local c = game:GetService("Players").LocalPlayer.Character
if c and c:GetAttribute("action") == true then
c:SetAttribute("action", false)
end
end)
end)
end
end
end
end
return oldNamecall(self, ...)
end)
VeilState.remoteHooked = true
end)
end)
end
veil_setupInterceptor()
function veil_fire()
if VeilState.attackCooldown then return end
VeilState.attackCooldown = true
task.delay(2, function() VeilState.attackCooldown = false end)
local myChar = LocalPlayer.Character
local startPart = myChar and (myChar:FindFirstChild("Head") or myChar:FindFirstChild("HumanoidRootPart"))
if not startPart then return end
local startPos = startPart.Position
local targetInfo = veil_getClosestSurvivor()
local aimDir
if targetInfo and targetInfo.Part then
local targetPart = targetInfo.Part
local targetPlayer = targetInfo.Player
local targetPos = targetPart.Position
local velocity = Veil_GetRealVelocity(targetPart, targetPlayer.Name)
local horizontalVel = Vector3.new(velocity.X, 0, velocity.Z)
local speed = horizontalVel.Magnitude
local distance = (targetPos - startPos).Magnitude
local timeToHit = distance / VeilConfig.SpearSpeed
local horizontalPrediction = Vector3.zero
if speed > 4 and VeilConfig.AutoPredict then
local factor = VeilConfig.HorizontalPredictFactor
horizontalPrediction = horizontalVel * timeToHit * factor
end
local predictedPos = targetPos + horizontalPrediction
local autoGravity = math.max(0, distance - 8)
local gravity = VeilConfig.AutoPredict and autoGravity or VeilConfig.Gravity
local drop = 0.5 * gravity * (timeToHit ^ 2)
local finalPos = predictedPos + Vector3.new(0, drop, 0)
aimDir = (finalPos - startPos).Unit
VeilState.lastPredictedPos = finalPos
else
aimDir = workspace.CurrentCamera.CFrame.LookVector
VeilState.lastPredictedPos = nil
end
pcall(function()
local remotes = game:GetService("ReplicatedStorage"):FindFirstChild("Remotes")
if remotes then
local killers = remotes:FindFirstChild("Killers")
if killers then
local veil = killers:FindFirstChild("Veil")
if veil and veil:FindFirstChild("Spearthrow") then
veil.Spearthrow:FireServer(aimDir, VeilConfig.SpearSpeed, startPos)
end
end
end
end)
VeilDraw.FOVCircle.Color = Color3.fromRGB(255, 0, 255)
if not VeilState.passiveCooldown then
VeilState.passiveCooldown = true
task.delay(30, function()
VeilDraw.FOVCircle.Color = Color3.fromRGB(255, 0, 255)
VeilState.passiveCooldown = false
end)
end
end
game:GetService("UserInputService").InputBegan:Connect(function(input, gp)
local isTouch = input.UserInputType == Enum.UserInputType.Touch
if gp and not isTouch then return end
local char = LocalPlayer.Character
local isSpearMode = char and char:GetAttribute("spearmode") == true
if not VeilConfig.Enabled then return end
if not isSpearMode then return end
if input.UserInputType == Enum.UserInputType.MouseButton1 then
VeilState.chargingSpear = true
elseif isTouch then
local pGui = LocalPlayer:FindFirstChild("PlayerGui")
if pGui then
local slasher = pGui:FindFirstChild("Slasher-mob")
if slasher then
local ctrl = slasher:FindFirstChild("Controls")
if ctrl then
local attackBtn = ctrl:FindFirstChild("attack")
if attackBtn and attackBtn.Visible then
local pos = input.Position
local absPos = attackBtn.AbsolutePosition
local absSize = attackBtn.AbsoluteSize
if pos.X >= absPos.X and pos.X <= absPos.X + absSize.X
and pos.Y >= absPos.Y and pos.Y <= absPos.Y + absSize.Y then
VeilState.chargingSpear = true
VeilState.touchInput = input
end
end
end
end
end
end
end)
game:GetService("UserInputService").InputEnded:Connect(function(input, gp)
if VeilState.chargingSpear
and (input == VeilState.touchInput or input.UserInputType == Enum.UserInputType.MouseButton1) then
VeilState.chargingSpear = false
if VeilState.touchInput == input then VeilState.touchInput = nil end
veil_fire()
end
end)
game:GetService("RunService").RenderStepped:Connect(function()
local cam = workspace.CurrentCamera
local myChar = LocalPlayer.Character
local isSpearMode = myChar and myChar:GetAttribute("spearmode") == true
if VeilConfig.Enabled and VeilConfig.ShowFOV and isSpearMode then
VeilDraw.FOVCircle.Visible = true
VeilDraw.FOVCircle.Radius = VeilConfig.FOV
VeilDraw.FOVCircle.Position = Vector2.new(cam.ViewportSize.X / 2, cam.ViewportSize.Y / 2)
else
VeilDraw.FOVCircle.Visible = false
end
if VeilState.chargingSpear and VeilConfig.Enabled and isSpearMode then
local target = veil_getClosestSurvivor()
if target and target.Part and target.Part.Parent then
VeilDraw.Highlight.Parent = target.Part.Parent
if VeilConfig.ShowTargetLaser then
if not getgenv().KYS_SpearLaserPart then
local laser = Instance.new("Part")
laser.Name = "SpearSilentAimLaser"
laser.Anchored = true
laser.CanCollide = false
laser.CanTouch = false
laser.CastShadow = false
laser.Material = Enum.Material.Neon
laser.Color = Color3.fromRGB(255, 50, 50)
laser.Transparency = 0
laser.Parent = workspace
getgenv().KYS_SpearLaserPart = laser
end
local originPart = myChar and (myChar:FindFirstChild("Head") or myChar:FindFirstChild("HumanoidRootPart"))
if originPart then
local originPos = originPart.Position
local targetPos = target.Part.Position
local dist = (targetPos - originPos).Magnitude
if dist > 0.1 then
local laser = getgenv().KYS_SpearLaserPart
laser.Size = Vector3.new(0.16, 0.16, dist)
laser.CFrame = CFrame.new((originPos + targetPos) / 2, targetPos)
laser.Transparency = 0.5
end
end
else
if getgenv().KYS_SpearLaserPart then getgenv().KYS_SpearLaserPart.Transparency = 1 end
end
else
VeilDraw.Highlight.Parent = nil
if getgenv().KYS_SpearLaserPart then getgenv().KYS_SpearLaserPart.Transparency = 1 end
end
else
VeilDraw.Highlight.Parent = nil
if getgenv().KYS_SpearLaserPart then getgenv().KYS_SpearLaserPart.Transparency = 1 end
end
if VeilConfig.Enabled and isSpearMode and VeilState.lastPredictedPos then
local screenPos, onScreen = cam:WorldToViewportPoint(VeilState.lastPredictedPos)
local viewport = cam.ViewportSize
local center = Vector2.new(viewport.X / 2, viewport.Y / 2)
if onScreen then
VeilDraw.Tracer.Position = Vector2.new(screenPos.X, screenPos.Y)
else
local dx = screenPos.X - center.X
local dy = screenPos.Y - center.Y
if math.abs(dx) < 1 and math.abs(dy) < 1 then
VeilDraw.Tracer.Position = center
else
local angle = math.atan2(dy, dx)
local maxX = viewport.X / 2 - 10
local maxY = viewport.Y / 2 - 10
local scaleX = maxX / math.abs(dx)
local scaleY = maxY / math.abs(dy)
local scale = math.min(scaleX, scaleY)
local borderPos = Vector2.new(
center.X + dx * scale,
center.Y + dy * scale
)
VeilDraw.Tracer.Position = borderPos
end
end
VeilDraw.Tracer.Visible = true
else
VeilDraw.Tracer.Visible = false
end
end)
-- =====================================================
-- UI TABS
-- =====================================================
local Main, ESPTab, MapTab, FOVTab
local SurvivorTab, KillerTab, GeneratorTab, FlingTab, SettingsTab, ResetTab
local VisualTab, MainTab, AimTab, MappingTab, PlayerTab
local VisualFeatureTabs, MainFeatureTabs, MainKillerFeatureTabs, AimFeatureTabs, MappingFeatureTabs, PlayerFeatureTabs, PlayerMiscFeatureTabs
local KYS_MainInfoPanel = {
Widgets = {},
Texts = {},
}
function KYS_InfoPlainText(text)
text = tostring(text or "")
text = text:gsub("
", "\n")
text = text:gsub("<[^>]->", "")
text = text:gsub("<", "<"):gsub(">", ">"):gsub("&", "&")
return text
end
function KYS_UpdateInfoWidget(widget, text)
if not widget then return end
local title, content = tostring(text or ""):match("^(.-)\n(.*)$")
title = title or tostring(text or "")
content = content or ""
pcall(function()
if type(widget.Set) == "function" then
pcall(function() widget:Set({ Name = title, Title = title, Content = content, Description = content, Text = content }) end)
widget:Set(text)
elseif type(widget.SetText) == "function" then
widget:SetText(text)
elseif type(widget.SetContent) == "function" then
widget:SetContent(content)
elseif type(widget.SetDescription) == "function" then
widget:SetDescription(content)
elseif type(widget.Update) == "function" then
pcall(function() widget:Update({ Name = title, Title = title, Content = content, Description = content, Text = content }) end)
widget:Update(text)
elseif type(widget.SetValue) == "function" then
widget:SetValue(text)
end
end)
pcall(function()
if widget.Text ~= nil then widget.Text = text end
if widget.Name ~= nil and type(widget.Name) == "string" then widget.Name = title end
if widget.TextLabel then widget.TextLabel.Text = content ~= "" and content or text end
if widget.Label then widget.Label.Text = text end
if widget.Title then widget.Title.Text = title end
if widget.Content then widget.Content.Text = content ~= "" and content or text end
if widget.Description then widget.Description.Text = content end
end)
end
function KYS_SetMainInfoPanelText(key, title, text)
local value = tostring(title or key) .. "\n" .. KYS_InfoPlainText(text)
KYS_MainInfoPanel.Texts[key] = value
KYS_UpdateInfoWidget(KYS_MainInfoPanel.Widgets[key], value)
end
function KYS_RegisterMainInfoWidget(key, widget)
KYS_MainInfoPanel.Widgets[key] = widget
if KYS_MainInfoPanel.Texts[key] then
KYS_UpdateInfoWidget(widget, KYS_MainInfoPanel.Texts[key])
end
end
function KYS_AddMainInfoLine(section, key, title, defaultText)
local defaultValue = tostring(title) .. "\n" .. tostring(defaultText or "Off")
KYS_MainInfoPanel.Texts[key] = KYS_MainInfoPanel.Texts[key] or defaultValue
local ok, widget = pcall(function()
if section.AddParagraph then
return section:AddParagraph({
Name = title,
Title = title,
Content = tostring(defaultText or "Off"),
Description = tostring(defaultText or "Off"),
Text = tostring(defaultText or "Off"),
})
end
end)
if ok and widget then return KYS_RegisterMainInfoWidget(key, widget) end
ok, widget = pcall(function()
if section.AddLabel then
return section:AddLabel({
Name = defaultValue,
Text = defaultValue,
})
end
end)
if ok and widget then return KYS_RegisterMainInfoWidget(key, widget) end
ok, widget = pcall(function()
if section.AddButton then
return section:AddButton({
Name = defaultValue,
Callback = function() end,
})
end
end)
if ok and widget then return KYS_RegisterMainInfoWidget(key, widget) end
end
if Window then
local function makeModernAdapter(section)
local adapter = {}
setmetatable(adapter, {
__index = function(t, k)
if k == "AddSection" then
return function(self, cfg)
if cfg and cfg.Name then
pcall(function() section:AddDivider({ Text = cfg.Name }) end)
end
return adapter
end
end
if k == "AddSlider" then
return function(self, cfg)
if cfg and cfg.Name then
local modernCfg = {
Name = cfg.Name,
Flag = cfg.Flag or cfg.Name,
Min = cfg.Min or 0,
Max = cfg.Max or 100,
Default = cfg.Default or cfg.Min or 0,
Value = cfg.Default or cfg.Min or 0,
Increment = cfg.Increment or 1,
}
local isFloat = false
if modernCfg.Increment < 1 or (math.floor(modernCfg.Min) ~= modernCfg.Min) or (math.floor(modernCfg.Max) ~= modernCfg.Max) then
isFloat = true
end
if isFloat then
modernCfg.Rounding = 1
if modernCfg.Increment <= 0.01 then
modernCfg.Rounding = 2
end
else
modernCfg.Rounding = 0
end
modernCfg.Callback = function(Value)
if cfg.Callback then
pcall(function() cfg.Callback(Value) end)
end
end
pcall(function() section:AddSlider(modernCfg) end)
end
return adapter
end
end
if type(section[k]) == "function" then
return function(self, ...)
return section[k](section, ...)
end
end
return section[k]
end
})
return adapter
end
local Tabs = {
Visual = Window:AddTab({ Name = "Visual", Icon = "lucide:eye", Type = "Single" }),
Main = Window:AddTab({ Name = "Main", Icon = "lucide:cpu", Type = "Single" }),
Aim = Window:AddTab({ Name = "Aim", Icon = "lucide:crosshair", Type = "Single" }),
Mapping = Window:AddTab({ Name = "Mapping", Icon = "lucide:map", Type = "Single" }),
Player = Window:AddTab({ Name = "Player", Icon = "lucide:user", Type = "Single" }),
}
local function adaptTab(tab)
local adapter = {}
setmetatable(adapter, {
__index = function(t, k)
if k == "AddSection" then
return function(self, cfg)
if cfg and cfg.Name then
pcall(function() tab:AddDivider({ Text = cfg.Name }) end)
end
return makeModernAdapter(tab)
end
end
return tab[k]
end
})
return adapter
end
local function addCenterFeatureTabbox(tab, name, entries)
local tabbox = tab:AddCenterTabbox(name)
local created = {}
for _, entry in ipairs(entries) do
created[entry.Key] = makeModernAdapter(tabbox:AddTab({
Name = entry.Name,
Icon = entry.Icon,
}))
end
return created
end
VisualFeatureTabs = addCenterFeatureTabbox(Tabs.Visual, "Visual Features", {
{ Key = "ESP", Name = "ESP", Icon = "lucide:eye" },
{ Key = "Camera", Name = "Camera", Icon = "solar:camera-bold" },
{ Key = "Lighting", Name = "Lighting", Icon = "solar:sun-bold" },
})
MainFeatureTabs = addCenterFeatureTabbox(Tabs.Main, "Main Features", {
{ Key = "Survivor", Name = "Survivor", Icon = "solar:shield-bold" },
{ Key = "Escape", Name = "Escape", Icon = "solar:exit-bold" },
{ Key = "Automation", Name = "Automation", Icon = "solar:bolt-bold" },
})
MainKillerFeatureTabs = addCenterFeatureTabbox(Tabs.Main, "Killer & Utilities", {
{ Key = "Killer", Name = "Killer", Icon = "solar:danger-bold" },
{ Key = "Ability", Name = "Killer Ability", Icon = "solar:bolt-bold" },
{ Key = "Utilities", Name = "Utilities", Icon = "solar:settings-bold" },
})
AimFeatureTabs = addCenterFeatureTabbox(Tabs.Aim, "Aim Features", {
{ Key = "Aimbot", Name = "Aimbot", Icon = "solar:target-bold" },
{ Key = "Spear", Name = "Killer Aim", Icon = "lucide:sword" },
{ Key = "AutoAim", Name = "Survivor Aim", Icon = "solar:magic-stick-3-bold" },
})
MappingFeatureTabs = addCenterFeatureTabbox(Tabs.Mapping, "Mapping Features", {
{ Key = "Teleport", Name = "Teleport", Icon = "solar:map-point-bold" },
{ Key = "Radar", Name = "Radar", Icon = "solar:radar-bold" },
})
PlayerFeatureTabs = addCenterFeatureTabbox(Tabs.Player, "Player Features", {
{ Key = "Movement", Name = "Movement", Icon = "solar:running-round-bold" },
{ Key = "Fling", Name = "Fling", Icon = "solar:wind-bold" },
{ Key = "Emote", Name = "Emote [BETA]", Icon = "solar:music-note-bold" },
})
PlayerMiscFeatureTabs = addCenterFeatureTabbox(Tabs.Player, "Player Misc", {
{ Key = "Fun", Name = "Fun", Icon = "solar:gamepad-bold" },
{ Key = "Streamer", Name = "Streamer Mode", Icon = "solar:settings-bold" },
{ Key = "Avatar", Name = "Korless", Icon = "solar:users-group-rounded-bold" },
})
VisualTab = VisualFeatureTabs.ESP
MainTab = adaptTab(Tabs.Main)
AimTab = adaptTab(Tabs.Aim)
MappingTab = MappingFeatureTabs.Teleport
PlayerTab = adaptTab(Tabs.Player)
end
if Window then
do -- Player Tab
local movSection = PlayerFeatureTabs.Movement:AddSection({
Position = "Center",
Name = "Movement",
Icon = "solar:running-round-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
movSection:AddToggle({
Default = false,
Name = "Auto Crouch BETA",
Locked = false,
TextLocked = "Premium Required",
Flag = "Auto Crouch BETA",
Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Auto Crouch BETA hanya untuk pengguna Key Premium!", 5)
return
end
setAutoCrouch(v)
end
})
movSection:AddToggle({
Default = false,
Name = "Speed Hack", Flag = "Speed Hack",
Callback = function(v)
VD.Speed = v
if not v then
local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
if hum then pcall(function() hum.WalkSpeed = 16 end) end
end
end
})
movSection:AddSlider({
Name = "Speed Value", Flag = "Speed Value",
Min = 16, Max = 200, Default = 16,
Callback = function(v)
VD.SpeedValue =
v
end
})
movSection:AddToggle({
Default = false,
Name = "Jump Hack", Flag = "Jump Hack",
Callback = function(v)
VD.Jump = v
if not v then
local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
if hum then pcall(function() hum.JumpPower = 0 end) end
end
end
})
movSection:AddSlider({
Name = "Jump Power", Flag = "Jump Power",
Min = 50, Max = 300, Default = 50,
Callback = function(v)
VD.JumpValue =
v
end
})
movSection:AddToggle({ Default = false, Name = "Infinite Jump", Flag = "Infinite Jump", Callback = function(v) VD.InfiniteJump = v end })
movSection:AddToggle({ Default = false, Name = "Anti Fall Damage", Flag = "Anti Fall Damage", Callback = function(v) VD.AntiFallDamage = v end })
movSection:AddToggle({ Default = false, Name = "Noclip", Flag = "Noclip", Callback = function(v)
VD.Noclip = v
if not v and getgenv().VD_DisableNoclip then pcall(getgenv().VD_DisableNoclip) end
end })
movSection:AddToggle({ Default = false, Name = "Moonwalk", Flag = "Moonwalk", Callback = function(v)
if getgenv().VD_SetMoonwalkButtonVisible then
getgenv().VD_SetMoonwalkButtonVisible(v)
else
VD.MoonwalkButton = v
end
end })
movSection:AddToggle({ Default = false, Name = "Lock Moonwalk Button", Flag = "Lock Moonwalk Button", Callback = function(v)
VD.MoonwalkButtonLocked = v and true or false
end })
movSection:AddSlider({
Name = "Moonwalk Zigzag Speed", Flag = "Moonwalk Zigzag Speed",
Min = 1, Max = 30, Default = 11,
Callback = function(v)
VD.MoonwalkZigzagSpeed = v
end
})
movSection:AddSlider({
Name = "Moonwalk Boost Power", Flag = "Moonwalk Boost Power",
Min = 1, Max = 2, Default = 1.08, Increment = 0.01,
Callback = function(v)
VD.MoonwalkBoostPower = v
end
})
movSection:AddToggle({ Default = false, Name = "Invisible Not Visual", Locked = false, TextLocked = "Premium Required", Flag = "Invisible Not Visual", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Invisible Not Visual hanya untuk pengguna Key Premium!", 5)
return
end
VD.InvisibleNotVisual = v; if not v and VD_InvisibleNV.Active then pcall(VD_SetInvisibleNotVisual, false) end
end })
movSection:AddSlider({
Name = "Invisible Speed", Flag = "Invisible Speed",
Min = 1, Max = 999, Default = 5,
Callback = function(v)
VD.InvisibleSpeed = v
end
})
movSection:AddToggle({ Default = false, Name = "Anti AFK", Flag = "Anti AFK", Callback = function(v) VD.AntiAFK = v end })
-- removed PlayerTab AddDivider
end
do -- ESP Tab
-- Visual Highlight ESP baru masuk di sini.
-- Drawing ESP PC lama tetap dipertahankan.
pcall(function()
if getgenv().KYS_AddVisualESPControls then
getgenv().KYS_AddVisualESPControls(VisualTab)
end
end)
end
do -- Aim Tab
local aimbotSection = AimFeatureTabs.Aimbot:AddSection({
Position = "Center",
Name = "Aimbot",
Icon = "solar:target-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
aimbotSection:AddToggle({ Default = false, Name = "Enable Aimbot", Flag = "Enable Aimbot", Callback = function(v) VD.AIM_Enabled = v end })
aimbotSection:AddToggle({ Default = false, Name = "Use RMB to aim", Flag = "Use RMB to aim", Callback = function(v) VD.AIM_UseRMB = v end })
aimbotSection:AddToggle({ Default = false, Name = "Show FOV Circle", Flag = "Show FOV Circle", Callback = function(v) VD.AIM_ShowFOV = v end })
aimbotSection:AddSlider({
Name = "FOV Size (aim radius on screen)", Flag = "FOV Size (aim radius on screen)",
Min = 20, Max = 400, Default = 120,
Callback = function(
v)
VD.AIM_FOV = v
end
})
aimbotSection:AddSlider({
Name = "Smoothness (Speed Aim)", Flag = "Smoothness",
Min = 0.1, Max = 10, Default = 0.3, Increment = 0.05,
Callback = function(v)
VD.AIM_Smooth = v
end
})
aimbotSection:AddToggle({ Default = false, Name = "Visibility Check", Flag = "Visibility Check", Callback = function(v) VD.AIM_VisCheck = v end })
aimbotSection:AddToggle({ Default = false, Name = "Prediction", Flag = "Prediction", Callback = function(v) VD.AIM_Predict = v end })
local crosshairSection = AimFeatureTabs.Aimbot:AddSection({
Position = "Center",
Name = "Advanced Crosshair",
Icon = "solar:target-broken",
Box = true,
BoxBorder = true,
Opened = false,
})
crosshairSection:AddToggle({ Default = false, Name = "Enable Crosshair", Flag = "CROSS_Enabled", Callback = function(v) VD.CROSS_Enabled = v pcall(VD_UpdateCrosshair) end })
crosshairSection:AddColorPicker({ Name = "Crosshair Color", Flag = "CROSS_Color", Default = VD.CROSS_Color or Color3.fromRGB(255, 255, 255), Callback = function(v) VD.CROSS_Color = v pcall(VD_UpdateCrosshair) end })
crosshairSection:AddDropdown({ Name = "Crosshair Style", Flag = "CROSS_Style", Default = "Dot", Values = { "Dot", "Plus", "X", "Box" }, Multi = false, Callback = function(v) VD.CROSS_Style = type(v) == "table" and v[1] or v pcall(VD_UpdateCrosshair) end })
crosshairSection:AddSlider({ Name = "Crosshair Size", Flag = "CROSS_Size", Min = 1, Max = 100, Default = 3, Increment = 1, Callback = function(v) VD.CROSS_Size = v pcall(VD_UpdateCrosshair) end })
crosshairSection:AddSlider({ Name = "Crosshair Thickness", Flag = "CROSS_Thickness", Min = 1, Max = 20, Default = 4, Increment = 1, Callback = function(v) VD.CROSS_Thickness = v pcall(VD_UpdateCrosshair) end })
crosshairSection:AddSlider({ Name = "Crosshair Gap", Flag = "CROSS_Gap", Min = 0, Max = 50, Default = 6, Increment = 1, Callback = function(v) VD.CROSS_Gap = v pcall(VD_UpdateCrosshair) end })
crosshairSection:AddSlider({ Name = "Position X Offset", Flag = "CROSS_PosX", Min = -500, Max = 500, Default = 0, Increment = 1, Callback = function(v) VD.CROSS_PosX = v pcall(VD_UpdateCrosshair) end })
crosshairSection:AddSlider({ Name = "Position Y Offset", Flag = "CROSS_PosY", Min = -500, Max = 500, Default = 0, Increment = 1, Callback = function(v) VD.CROSS_PosY = v pcall(VD_UpdateCrosshair) end })
local spearSection = AimFeatureTabs.Spear:AddSection({
Position = "Center",
Name = "Aimbot Spear (Veil)",
Icon = "lucide:sword",
Box = true,
BoxBorder = true,
Opened = false,
})
spearSection:AddToggle({ Default = false, Name = "Spear Aimbot", Flag = "Spear Aimbot", Callback = function(v) VD.SPEAR_Aimbot = v end })
spearSection:AddSlider({
Name = "Spear Gravity", Flag = "Spear Gravity",
Min = 10, Max = 200, Default = 50,
Callback = function(v)
VD.SPEAR_Gravity =
v
end
})
spearSection:AddSlider({
Name = "Spear Speed", Flag = "Spear Speed",
Min = 50, Max = 300, Default = 100,
Callback = function(v)
VD.SPEAR_Speed =
v
end
})
spearSection:AddKeybind({
Name = "Toggle Keybind (PC)", Flag = "Spear Keybind", Default = "None",
Callback = function()
if not VD.SPEAR_Aimbot or GetRole() ~= "Killer" then return end
SpearBtnData.Active = not SpearBtnData.Active
if SpearBtnData.Active then
pcall(VD_Notify, "Spear Aimbot", "Spear Aimbot AKTIF!", 3)
else
pcall(VD_Notify, "Spear Aimbot", "Spear Aimbot NONAKTIF", 3)
end
end
})
spearSection:AddDivider({ Text = "Silent Aim (Veil)" })
spearSection:AddToggle({ Default = false, Name = "Silent Aim Spear (Veil)", Locked = false, TextLocked = "Premium Required", Flag = "Silent Aim Spear (Veil)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Silent Aim Spear hanya untuk pengguna Key Premium!", 5)
return
end
VeilConfig.Enabled = v
end })
spearSection:AddToggle({ Default = true, Name = "Show FOV Circle", Flag = "Show FOV Circle", Callback = function(v) VeilConfig.ShowFOV = v end })
spearSection:AddToggle({ Default = true, Name = "Show Target Laser", Flag = "Show Target Laser", Callback = function(v) VeilConfig.ShowTargetLaser = v end })
spearSection:AddSlider({ Name = "FOV Radius", Flag = "FOV Radius", Min = 50, Max = 500, Default = 150, Callback = function(v) VeilConfig.FOV = v end })
spearSection:AddToggle({ Default = false, Name = "Auto Predict", Flag = "Auto Predict", Callback = function(v) VeilConfig.AutoPredict = v end })
spearSection:AddSlider({ Name = "Spear Speed", Flag = "Spear Speed", Min = 50, Max = 300, Default = 165, Callback = function(v) VeilConfig.SpearSpeed = v end })
spearSection:AddSlider({ Name = "Gravity", Flag = "Gravity", Min = 0, Max = 300, Default = math.floor(workspace.Gravity * 0.5), Callback = function(v) VeilConfig.Gravity = v end })
spearSection:AddSlider({ Name = "Horizontal Vector", Flag = "Horizontal Vector", Min = 0, Max = 5, Default = 1.0, Decimals = 2, Callback = function(v) VeilConfig.HorizontalPredictFactor = v end })
spearSection:AddDropdown({ Name = "Target Part", Flag = "Target Part", Values = {"Torso", "Head", "Root"}, Default = "Torso", Multi = false, Callback = function(v)
if type(v) == "table" then v = v[1] end
VeilConfig.TargetPart = v
end })
local flaskSection = AimFeatureTabs.Spear:AddSection({
Position = "Center",
Name = "Silent Aim Flask (Cure)",
Icon = "lucide:flask-conical",
Box = true,
BoxBorder = true,
Opened = false,
})
flaskSection:AddToggle({ Default = false, Name = "Silent Aim Flask (Cure)", Locked = false, TextLocked = "Premium Required", Flag = "Silent Aim Flask (Cure)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Silent Aim Flask (Cure) hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_SilentAimFlask = v
end })
flaskSection:AddToggle({ Default = false, Name = "Flask Laser (Cure)", Locked = false, TextLocked = "Premium Required", Flag = "Flask Laser (Cure)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Flask Laser (Cure) hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_FlaskLaser = v
if v then
pcall(KYS_StartCureFlaskLaser)
else
if getgenv().KYS_CureFlaskLaserThread then
getgenv().KYS_CureFlaskLaserThread:Disconnect()
getgenv().KYS_CureFlaskLaserThread = nil
end
if getgenv().KYS_CureFlaskLaserPart then
pcall(function() getgenv().KYS_CureFlaskLaserPart:Destroy() end)
getgenv().KYS_CureFlaskLaserPart = nil
end
end
end })
local tofSection = AimFeatureTabs.AutoAim:AddSection({
Position = "Center",
Name = "Silent Aim Twist Of Fate",
Icon = "solar:magic-stick-3-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
tofSection:AddToggle({
Default = false,
Name = "Silent Aim Twist Of Fate",
Locked = false,
TextLocked = "Premium Required",
Flag = "Silent Aim Twist Of Fate",
Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Silent Aim Twist Of Fate hanya untuk pengguna Key Premium!", 5)
return
end
if getgenv().KYS_SetToFSilentAim then
getgenv().KYS_SetToFSilentAim(v)
end
end
})
tofSection:AddToggle({
Default = true,
Name = "ToF Laser",
Locked = false,
TextLocked = "Premium Required",
Flag = "ToF Laser",
Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur ToF Laser hanya untuk pengguna Key Premium!", 5)
return
end
VD.TOF_Laser = v
if not v and getgenv().KYS_ToFClearLaser then
getgenv().KYS_ToFClearLaser()
end
end
})
tofSection:AddToggle({
Default = false,
Name = "ToF Wall Check",
Locked = false,
TextLocked = "Premium Required",
Flag = "ToF Wall Check",
Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur ToF Wall Check hanya untuk pengguna Key Premium!", 5)
return
end
VD.TOF_WallCheck = v
end
})
tofSection:AddToggle({
Default = true,
Name = "ToF Block When Knocked",
Locked = false,
TextLocked = "Premium Required",
Flag = "ToF Block When Knocked",
Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur ToF Block When Knocked hanya untuk pengguna Key Premium!", 5)
return
end
VD.TOF_BlockKnocked = v
end
})
tofSection:AddDropdown({
Name = "ToF Target Mode",
Flag = "ToF Target Mode",
Values = { "Killer", "Survivors", "Zombie" },
Default = VD.TOF_TargetMode or "Killer",
Multi = false,
Callback = function(v)
if type(v) == "table" then v = v[1] end
if getgenv().KYS_ToFSetTargetMode then
getgenv().KYS_ToFSetTargetMode(v or "Killer", false)
else
VD.TOF_TargetMode = v or "Killer"
end
end
})
tofSection:AddDropdown({
Name = "Silent Aim Key",
Flag = "Silent Aim Key",
Values = { "None", "Q", "E", "R", "T", "F", "G", "H", "J", "K", "L", "X", "Z" },
Default = VD.TOF_Key or "None",
Multi = false,
Callback = function(v)
if type(v) == "table" then v = v[1] end
VD.TOF_Key = v or "None"
end
})
local flashlightSection = AimFeatureTabs.AutoAim:AddSection({
Position = "Center",
Name = "Silent Aim Flashlight",
Icon = "lucide:flashlight",
Box = true,
BoxBorder = true,
Opened = false,
})
flashlightSection:AddToggle({
Default = false,
Name = "Silent Aim Flashlight",
Locked = false,
TextLocked = "Premium Required",
Flag = "Silent Aim Flashlight",
Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Silent Aim Flashlight hanya untuk pengguna Key Premium!", 5)
return
end
if getgenv().KYS_SetFlashlightSilentAim then
getgenv().KYS_SetFlashlightSilentAim(v)
else
VD.FLASH_SilentAim = v
end
end
})
flashlightSection:AddToggle({
Default = true,
Name = "Flashlight Laser",
Locked = false,
TextLocked = "Premium Required",
Flag = "Flashlight Laser",
Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Flashlight Laser hanya untuk pengguna Key Premium!", 5)
return
end
VD.FLASH_Laser = v
if not v and getgenv().KYS_ClearFlashlightLaser then
getgenv().KYS_ClearFlashlightLaser()
end
end
})
flashlightSection:AddDropdown({
Name = "Flashlight Target Part",
Flag = "Flashlight Target Part",
Values = { "Head", "HumanoidRootPart", "UpperTorso", "Torso" },
Default = VD.FLASH_TargetPart or "Head",
Multi = false,
Callback = function(v)
if type(v) == "table" then v = v[1] end
VD.FLASH_TargetPart = v or "Head"
end
})
flashlightSection:AddSlider({
Name = "Flashlight Range",
Flag = "Flashlight Range",
Min = 20,
Max = 250,
Default = tonumber(VD.FLASH_Range) or 120,
Callback = function(v)
VD.FLASH_Range = tonumber(v) or 120
end
})
flashlightSection:AddSlider({
Name = "Flashlight Smoothness",
Flag = "Flashlight Smoothness",
Min = 0.05,
Max = 1,
Default = tonumber(VD.FLASH_Smooth) or 0.35,
Decimals = 2,
Callback = function(v)
VD.FLASH_Smooth = tonumber(v) or 0.35
end
})
end
do -- FOV Tab
local camSection = VisualFeatureTabs.Camera:AddSection({
Position = "Center",
Name = "Camera",
Icon = "solar:camera-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
camSection:AddToggle({ Default = false, Name = "Enable Camera FOV override", Flag = "Enable Camera FOV override", Callback = function(v) VD.CAM_FOVEnabled = v end })
camSection:AddSlider({
Name = "Camera FOV", Flag = "Camera FOV",
Min = 30, Max = 140, Default = 90,
Callback = function(v)
VD.CAM_FOV =
v
end
})
camSection:AddToggle({ Default = false, Name = "Third Person (Killer only)", Flag = "Third Person (Killer only)", Callback = function(v) VD.CAM_ThirdPerson = v end })
camSection:AddToggle({ Default = false, Name = "Shift Lock (auto face camera)", Flag = "Shift Lock (auto face camera)", Callback = function(v) VD.CAM_ShiftLock = v end })
camSection:AddToggle({ Default = false, Name = "Infinity Zoom Out", Flag = "Infinity Zoom Out", Callback = function(v)
VD.CAM_InfinityZoom = v
LocalPlayer.CameraMaxZoomDistance = v and math.huge or 128
LocalPlayer.CameraMinZoomDistance = v and 0 or 0.5
end })
camSection:AddToggle({ Default = false, Name = "No Cutscene", Flag = "No Cutscene", Callback = function(v) VD.NoCutscene = v end })
-- removed FOVTab AddDivider
local visualSection = VisualFeatureTabs.Lighting:AddSection({
Position = "Center",
Name = "Visual",
Icon = "solar:sun-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
visualSection:AddToggle({ Default = false, Name = "No Fog (remove fog/post effects)", Flag = "No Fog (remove fog/post effects)", Callback = function(v) VD.NO_Fog = v end })
visualSection:AddToggle({ Default = false, Name = "Fullbright (lighting preset)", Flag = "Fullbright (lighting preset)", Callback = function(v)
VD.Fullbright = v
if VD.VIS_WeatherTheme and VD.VIS_WeatherTheme ~= "Default" then
pcall(VD_ApplyWeather, VD.VIS_WeatherTheme)
end
end })
visualSection:AddDropdown({
Name = "Weather & Sky Theme",
Default = "Default",
Values = {"Default", "Christmas (Snow)", "Heavy Rain (Storm)", "Autumn (Musim Gugur)", "Cherry Blossom (Sakura)", "Sunset (Golden Hour)", "Blood Moon (Spooky)", "Toxic Wasteland", "Vaporwave (Synthwave)", "Midnight (Pitch Black)"},
Flag = "Weather & Sky Theme",
Callback = function(v)
VD.VIS_WeatherTheme = v
pcall(VD_ApplyWeather, v)
end
})
local infoPanelSection = VisualFeatureTabs.Lighting:AddSection({
Position = "Center",
Name = "Game Info Panel",
Icon = "lucide:panel-top",
Box = true,
BoxBorder = true,
Opened = true,
})
KYS_AddMainInfoLine(infoPanelSection, "KystKiller", "Kyst Killer Display", "Off")
KYS_AddMainInfoLine(infoPanelSection, "KillerPerks", "Spectate Killer Perks", "Off")
KYS_AddMainInfoLine(infoPanelSection, "PredictMap", "Predict Map", "Off")
visualSection:AddToggle({ Default = false, Name = "Kyst Killer Display", Flag = "Kyst Killer Display", Callback = function(v)
VD.VIS_KystKiller = v
if v then
StartKystKiller()
else
StopKystKiller()
end
end })
visualSection:AddToggle({ Default = false, Name = "Enable Spectator Counter", Flag = "Enable Spectator Counter", Callback = function(v)
VD.VIS_SpectatorCounter = v
if v then
StartSpectatorCounter()
else
StopSpectatorCounter()
end
end })
visualSection:AddToggle({ Default = false, Name = "Killer Perks Display", Flag = "Killer Perks Display", Callback = function(v)
VD.VIS_KillerPerks = v
if v then
StartKillerPerksDisplay()
else
StopKillerPerksDisplay()
end
end })
visualSection:AddToggle({ Default = false, Name = "Predict Map", Flag = "Predict Map", Callback = function(v)
VD.VIS_PredictMap = v
if v then
StartPredictMap()
else
StopPredictMap()
end
end })
visualSection:AddToggle({ Default = false, Name = "Hide Survivor Icon", Flag = "Hide Survivor Icon", Callback = function(v)
if getgenv().KYS_SetHideSurvivorIcon then
getgenv().KYS_SetHideSurvivorIcon(v)
else
VD.VIS_HideSurvivorIcon = v
end
end })
visualSection:AddToggle({ Default = false, Name = "Show Ping & FPS", Flag = "Show Ping & FPS", Callback = function(v)
if getgenv().KYS_SetShowPingFPS then
getgenv().KYS_SetShowPingFPS(v)
else
VD.VIS_ShowPingFPS = v
end
end })
visualSection:AddToggle({ Default = false, Name = "Show Hook Counter", Flag = "Show Hook Counter", Callback = function(v)
if getgenv().KYS_SetShowHookCounter then
getgenv().KYS_SetShowHookCounter(v)
else
VD.VIS_ShowHookCounter = v
end
end })
end
do -- Survivor Tab
local combatSurv = MainFeatureTabs.Survivor:AddSection({
Position = "Center",
Name = "Survivor",
Icon = "solar:shield-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
combatSurv:AddToggle({ Default = false, Name = "Swift Vault", Flag = "SwiftVault", Callback = function(v) VD.SURV_AutoVault = v end })
combatSurv:AddToggle({ Default = false, Name = "Swift Vault V2", Locked = false, TextLocked = "Premium Required", Flag = "SURV_SwiftVaultV2", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Swift Vault V2 hanya untuk pengguna Key Premium!", 5)
return
end
VD.SURV_FastVault = v
if not v then
local char = LocalPlayer.Character
if char then char:SetAttribute("vaultspeed", 1) end
end
end })
combatSurv:AddSlider({
Name = "Vault Speed", Flag = "SURV_SwiftVaultSpeed",
Min = 10, Max = 20, Default = 13, Increment = 1,
Callback = function(v) VD.SURV_VaultSpeed = v end
})
combatSurv:AddToggle({ Default = false, Name = "Pallet Reflex", Flag = "Pallet Reflex", Callback = function(v) VD.SURV_AutoPallet = v end })
combatSurv:AddSlider({
Name = "Pallet Trigger Range (studs)", Flag = "Pallet Trigger Range",
Min = 5, Max = 50, Default = 20, Increment = 0.1,
Callback = function(v) VD.SURV_AutoPalletDist = v end
})
combatSurv:AddToggle({ Default = false, Name = "Anti Knock", Locked = false, TextLocked = "Premium Required", Flag = "Anti Knock", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Anti Knock hanya untuk pengguna Key Premium!", 5)
return
end
VD.SURV_AntiKnock = v
end })
combatSurv:AddToggle({ Default = false, Name = "Infinite Flashlight Battery", Flag = "Infinite Flashlight", Callback = function(v) setGodFlashlight(v) end })
combatSurv:AddToggle({ Default = false, Name = "Aura Heal (Self)", Flag = "Instant Heal (Self)", Callback = function(v) setInstantHealSelf(v) end })
combatSurv:AddToggle({ Default = false, Name = "Auto Dodge Spear (Veil)", Locked = false, TextLocked = "Premium Required", Flag = "Auto Dodge Spear", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Auto Dodge Spear hanya untuk pengguna Key Premium!", 5)
return
end
VD.SURV_AutoDodgeSpear = v
end })
combatSurv:AddToggle({ Default = false, Name = "Aura Heal All", Locked = false, TextLocked = "Premium Required", Flag = "Auto Heal All", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Aura Heal All hanya untuk pengguna Key Premium!", 5)
return
end
setAutoHealAll(v)
end })
combatSurv:AddToggle({
Default = false, Name = "First Person Camera (Survivor)", Flag = "First Person Camera (Survivor)", Callback = function(v)
VD.SURV_FirstPerson = v
if not v then
pcall(RestoreFirstPersonCamera)
end
end })
combatSurv:AddToggle({ Default = false, Name = "Auto Parry", Locked = false, TextLocked = "Premium Required", Flag = "Auto Parry", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Auto Parry hanya untuk pengguna Key Premium!", 5)
return
end
VD_SetAutoParry(v)
end })
combatSurv:AddToggle({ Default = false, Name = "Auto Parry Agresif", Flag = "Auto Parry Agresif", Callback = function(v) VD.SURV_ParryAggressive = v end })
combatSurv:AddSlider({
Name = "Parry Distance Trigger", Flag = "Parry Distance Trigger",
Min = 2, Max = 25, Default = 8, Increment = 0.1,
Callback = function(v)
VD.SURV_ParryDistance = v
end
})
combatSurv:AddToggle({
Default = false, Name = "Show Parry Range Circle", Flag = "Show Parry Range Circle", Callback = function(v)
VD.SURV_ShowParryCircle = v
if VD_ParryRange then VD_ParryRange.Transparency = 1 end
end })
combatSurv:AddToggle({ Default = false, Name = "Fake Parry (Press V)", Flag = "Fake Parry (Press V)", Callback = function(v)
VD.SURV_FakeParry = v
if FakeParryData.Button then FakeParryData.Button.Visible = v end
end })
combatSurv:AddDropdown({
Name = "Fake Parry Animation",
Values = {"Enten", "Stopwatch", "Fih", "BloodShield"},
Default = "Enten",
Multi = false,
Flag = "Fake Parry Animation",
Callback = function(v)
VD.SURV_FakeParryAnim = v
end
})
combatSurv:AddToggle({ Default = false, Name = "Undraggable Button (Fake Parry)", Locked = false, TextLocked = "Premium Required", Flag = "Undraggable Button (Fake Parry)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Undraggable Button hanya untuk pengguna Key Premium!", 5)
return
end
FakeParryData.DragLocked = v
end })
combatSurv:AddToggle({ Default = false, Name = "Fake Generator (Press B)", Flag = "Fake Generator (Press B)", Callback = function(v)
VD.SURV_FakeGen = v
if FakeGenData and FakeGenData.Button then FakeGenData.Button.Visible = v end
end })
combatSurv:AddToggle({ Default = false, Name = "Undraggable Button (Fake Gen)", Locked = false, TextLocked = "Premium Required", Flag = "Undraggable Button (Fake Gen)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Undraggable Button hanya untuk pengguna Key Premium!", 5)
return
end
if FakeGenData then FakeGenData.DragLocked = v end
end })
-- removed SurvivorTab AddDivider
end
local FakeParryAnimations = {
["Enten"] = "rbxassetid://127096285501517",
["Stopwatch"] = "rbxassetid://81793464499285",
["Fih"] = "rbxassetid://123307242865945",
["BloodShield"] = "rbxassetid://75939529748815",
}
getgenv().KYS_FakeParryTrack = nil
-- FAKE PARRY MOBILE UI DATA
FakeParryData = {
UI = nil,
Button = nil,
DragLocked = false,
Dragging = false,
DragStart = nil,
DragStartPos = nil
}
function setupFakeParryBtn()
local player = game:GetService("Players").LocalPlayer
local oldUI = player.PlayerGui:FindFirstChild("FakeParryUI")
if oldUI then oldUI:Destroy() end
FakeParryData.UI = Instance.new("ScreenGui")
FakeParryData.UI.Name = "FakeParryUI"
FakeParryData.UI.ResetOnSpawn = false
FakeParryData.UI.IgnoreGuiInset = true
FakeParryData.UI.Parent = player:WaitForChild("PlayerGui")
FakeParryData.Button = Instance.new("ImageButton")
FakeParryData.Button.Name = "FakeParryButton"
FakeParryData.Button.Size = UDim2.new(0, 60, 0, 60)
FakeParryData.Button.Position = UDim2.new(0.3, 0, 0.75, 0)
FakeParryData.Button.AnchorPoint = Vector2.new(0.5, 0.5)
FakeParryData.Button.BackgroundColor3 = Color3.fromRGB(20, 0, 30)
FakeParryData.Button.BackgroundTransparency = 0.15
FakeParryData.Button.AutoButtonColor = true
if type(VD) == "table" then FakeParryData.Button.Visible = VD.SURV_FakeParry else FakeParryData.Button.Visible = false end
FakeParryData.Button.ZIndex = 10
FakeParryData.Button.Parent = FakeParryData.UI
Instance.new("UICorner", FakeParryData.Button).CornerRadius = UDim.new(1, 0)
local s = Instance.new("UIStroke", FakeParryData.Button)
s.Color = Color3.fromRGB(150, 70, 255)
s.Thickness = 2; s.Transparency = 0.2
local lbl = Instance.new("TextLabel", FakeParryData.Button)
lbl.Size = UDim2.new(1, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = "FAKE\nPARRY"
lbl.TextColor3 = Color3.fromRGB(200, 150, 255)
lbl.TextScaled = true
lbl.Font = Enum.Font.GothamBlack
lbl.ZIndex = 11
FakeParryData.Button.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
if FakeParryData.DragLocked then return end
FakeParryData.Dragging = true
FakeParryData.DragStart = input.Position
FakeParryData.DragStartPos = FakeParryData.Button.Position
end
end)
game:GetService("UserInputService").InputChanged:Connect(function(input)
if FakeParryData.Dragging and not FakeParryData.DragLocked and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - FakeParryData.DragStart
FakeParryData.Button.Position = UDim2.new(
FakeParryData.DragStartPos.X.Scale, FakeParryData.DragStartPos.X.Offset + delta.X,
FakeParryData.DragStartPos.Y.Scale, FakeParryData.DragStartPos.Y.Offset + delta.Y
)
end
end)
FakeParryData.Button.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
FakeParryData.Dragging = false
end
end)
FakeParryData.Button.MouseButton1Click:Connect(VD_PlayFakeParry)
end
function VD_PlayFakeParry()
if not VD.SURV_FakeParry then return end
pcall(function()
local player = game:GetService("Players").LocalPlayer
local character = player.Character
if not character then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local animator = humanoid:FindFirstChildOfClass("Animator")
if not animator then
animator = Instance.new("Animator")
animator.Parent = humanoid
end
if getgenv().KYS_FakeParryTrack then
pcall(function() getgenv().KYS_FakeParryTrack:Stop() end)
getgenv().KYS_FakeParryTrack = nil
end
local animation = Instance.new("Animation")
animation.AnimationId = FakeParryAnimations[VD.SURV_FakeParryAnim] or FakeParryAnimations["Enten"]
local track = animator:LoadAnimation(animation)
track.Priority = Enum.AnimationPriority.Action
track:Play()
getgenv().KYS_FakeParryTrack = track
end)
end
if not getgenv().KYS_FakeParryInputConn then
getgenv().KYS_FakeParryInputConn = game:GetService("UserInputService").InputBegan:Connect(function(input, gp)
if gp then return end
if input.KeyCode == Enum.KeyCode.V then
VD_PlayFakeParry()
end
if input.KeyCode == Enum.KeyCode.B then
if type(VD_ToggleFakeGen) == "function" then VD_ToggleFakeGen() end
end
end)
end
setupFakeParryBtn()
game:GetService("Players").LocalPlayer.CharacterAdded:Connect(function()
task.wait(0.5)
setupFakeParryBtn()
if FakeParryData.Button and type(VD) == "table" then
FakeParryData.Button.Visible = VD.SURV_FakeParry
end
end)
-- ==========================================
-- FAKE GENERATOR LOGIC & MOBILE BUTTON
-- ==========================================
getgenv().KYS_FakeGenTrack = nil
FakeGenData = {
UI = nil,
Button = nil,
DragLocked = false,
Dragging = false,
DragStart = nil,
DragStartPos = nil
}
function VD_ToggleFakeGen()
if not VD.SURV_FakeGen then
if getgenv().KYS_FakeGenTrack then
pcall(function() getgenv().KYS_FakeGenTrack:Stop() end)
getgenv().KYS_FakeGenTrack = nil
end
if FakeGenData.Button then
FakeGenData.Button.BackgroundColor3 = Color3.fromRGB(20, 30, 0)
end
return
end
if getgenv().KYS_FakeGenTrack then
pcall(function() getgenv().KYS_FakeGenTrack:Stop() end)
getgenv().KYS_FakeGenTrack = nil
if FakeGenData.Button then
FakeGenData.Button.BackgroundColor3 = Color3.fromRGB(20, 30, 0)
end
else
pcall(function()
local player = game:GetService("Players").LocalPlayer
local character = player.Character
if not character then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local animator = humanoid:FindFirstChildOfClass("Animator")
if not animator then
animator = Instance.new("Animator")
animator.Parent = humanoid
end
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://83160743983246"
local track = animator:LoadAnimation(animation)
track.Looped = true
track.Priority = Enum.AnimationPriority.Action
track:Play()
getgenv().KYS_FakeGenTrack = track
if FakeGenData.Button then
FakeGenData.Button.BackgroundColor3 = Color3.fromRGB(80, 180, 100)
end
end)
end
end
function setupFakeGenBtn()
local player = game:GetService("Players").LocalPlayer
local oldUI = player.PlayerGui:FindFirstChild("FakeGenUI")
if oldUI then oldUI:Destroy() end
FakeGenData.UI = Instance.new("ScreenGui")
FakeGenData.UI.Name = "FakeGenUI"
FakeGenData.UI.ResetOnSpawn = false
FakeGenData.UI.IgnoreGuiInset = true
FakeGenData.UI.Parent = player:WaitForChild("PlayerGui")
FakeGenData.Button = Instance.new("ImageButton")
FakeGenData.Button.Name = "FakeGenButton"
FakeGenData.Button.Size = UDim2.new(0, 60, 0, 60)
FakeGenData.Button.Position = UDim2.new(0.4, 0, 0.75, 0)
FakeGenData.Button.AnchorPoint = Vector2.new(0.5, 0.5)
FakeGenData.Button.BackgroundColor3 = Color3.fromRGB(20, 30, 0)
FakeGenData.Button.BackgroundTransparency = 0.15
FakeGenData.Button.AutoButtonColor = true
if type(VD) == "table" then FakeGenData.Button.Visible = VD.SURV_FakeGen else FakeGenData.Button.Visible = false end
FakeGenData.Button.ZIndex = 10
FakeGenData.Button.Parent = FakeGenData.UI
Instance.new("UICorner", FakeGenData.Button).CornerRadius = UDim.new(1, 0)
local s = Instance.new("UIStroke", FakeGenData.Button)
s.Color = Color3.fromRGB(150, 255, 70)
s.Thickness = 2; s.Transparency = 0.2
local lbl = Instance.new("TextLabel", FakeGenData.Button)
lbl.Size = UDim2.new(1, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = "FAKE\nGEN"
lbl.TextColor3 = Color3.fromRGB(200, 255, 150)
lbl.TextScaled = true
lbl.Font = Enum.Font.GothamBlack
lbl.ZIndex = 11
FakeGenData.Button.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
if FakeGenData.DragLocked then return end
FakeGenData.Dragging = true
FakeGenData.DragStart = input.Position
FakeGenData.DragStartPos = FakeGenData.Button.Position
end
end)
game:GetService("UserInputService").InputChanged:Connect(function(input)
if FakeGenData.Dragging and not FakeGenData.DragLocked and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - FakeGenData.DragStart
FakeGenData.Button.Position = UDim2.new(
FakeGenData.DragStartPos.X.Scale, FakeGenData.DragStartPos.X.Offset + delta.X,
FakeGenData.DragStartPos.Y.Scale, FakeGenData.DragStartPos.Y.Offset + delta.Y
)
end
end)
FakeGenData.Button.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
FakeGenData.Dragging = false
end
end)
FakeGenData.Button.MouseButton1Click:Connect(VD_ToggleFakeGen)
end
setupFakeGenBtn()
game:GetService("Players").LocalPlayer.CharacterAdded:Connect(function()
if getgenv().KYS_FakeGenTrack then
pcall(function() getgenv().KYS_FakeGenTrack:Stop() end)
getgenv().KYS_FakeGenTrack = nil
end
task.wait(0.5)
setupFakeGenBtn()
if FakeGenData.Button and type(VD) == "table" then
FakeGenData.Button.Visible = VD.SURV_FakeGen
end
end)
do -- Killer Tab
local combatKiller = MainKillerFeatureTabs.Killer:AddSection({
Position = "Center",
Name = "Killer",
Icon = "solar:danger-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
combatKiller:AddToggle({ Default = false, Name = "Auto Attack", Flag = "Auto Attack", Callback = function(v) VD.AUTO_Attack = v end })
combatKiller:AddSlider({
Name = "Attack Range", Flag = "Attack Range",
Min = 5, Max = 20, Default = 12,
Callback = function(v)
VD.AUTO_AttackRange =
v
end
})
combatKiller:AddToggle({ Default = false, Name = "Hitbox Expand", Flag = "Hitbox Expand", Callback = function(v) VD.HITBOX_Enabled = v end })
combatKiller:AddSlider({
Name = "Hitbox Size", Flag = "Hitbox Size",
Min = 5, Max = 40, Default = 15,
Callback = function(v)
VD.HITBOX_Size =
v
end
})
combatKiller:AddToggle({ Default = false, Name = "Infinite Lunge (Basic Attack)", Flag = "Infinite Lunge (Basic Attack)", Callback = function(v)
VD.KILLER_InfLunge = v
end })
-- removed KillerTab AddDivider
local abilityKiller = MainKillerFeatureTabs.Ability:AddSection({
Position = "Center",
Name = "Killer Ability",
Icon = "solar:bolt-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
abilityKiller:AddToggle({ Default = false, Name = "Infinite Abyssal Burst (Abyss)", Locked = false, TextLocked = "Premium Required", Flag = "Infinite Abyssal Burst (Abyss)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Infinite Abyssal Burst (Abyss) hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_BypassCooldown = v
if v then
KYS_StartAbyssCooldownBypass()
else
KYS_StopAbyssCooldownBypass()
end
end })
abilityKiller:AddToggle({ Default = false, Name = "Infinite Skill (Hidden)", Locked = false, TextLocked = "Premium Required", Flag = "Infinite Skill (Hidden)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Infinite Skill (Hidden) hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_BypassLeap = v
if v then
pcall(KYS_StartHiddenCooldownBypass)
else
pcall(KYS_StopHiddenCooldownBypass)
end
end })
abilityKiller:AddToggle({ Default = false, Name = "Infinite Frenzy (Jeff)", Locked = false, TextLocked = "Premium Required", Flag = "Infinite Frenzy (Jeff)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Infinite Frenzy (Jeff) hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_InfFrenzy = v
if v then
pcall(KYS_StartJeffCooldownBypass)
else
pcall(KYS_StopJeffCooldownBypass)
end
end })
abilityKiller:AddToggle({ Default = false, Name = "Infinite Lake Mist (Jason)", Locked = false, TextLocked = "Premium Required", Flag = "Infinite Lake Mist (Jason)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Infinite Lake Mist (Jason) hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_InfLakeMist = v
if v then
pcall(KYS_StartSlasherCooldownBypass)
else
pcall(KYS_StopSlasherCooldownBypass)
end
end })
abilityKiller:AddToggle({ Default = false, Name = "Infinite Pursuit (Jason)", Locked = false, TextLocked = "Premium Required", Flag = "Infinite Pursuit (Jason)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Infinite Pursuit (Jason) hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_InfPursuit = v
if v then
pcall(KYS_StartSlasherCooldownBypass)
else
pcall(KYS_StopSlasherCooldownBypass)
end
end })
abilityKiller:AddToggle({ Default = false, Name = "Infinite Grab (Myers)", Locked = false, TextLocked = "Premium Required", Flag = "Infinite Grab (Myers)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Infinite Grab (Myers) hanya untuk pengguna Key Premium!", 5)
return
end
setMyersGrab(v)
end })
abilityKiller:AddToggle({ Default = false, Name = "Fake Attack (Counter Parry)", Locked = false, TextLocked = "Premium Required", Flag = "Fake Attack (Counter Parry)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Fake Attack hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_FakeAttack = v
pcall(KYS_ToggleFakeAttack, v)
end })
abilityKiller:AddToggle({ Default = false, Name = "Undraggable Button (Inf Grab)", Locked = false, TextLocked = "Premium Required", Flag = "Undraggable Button (Inf Grab)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Undraggable Button hanya untuk pengguna Key Premium!", 5)
return
end
setMyersDragLocked(v)
end })
pcall(function()
local customMaskedMasks = {"Richard", "Tony", "Brandon", "Jake", "Richter", "Graham", "Alex"}
abilityKiller:AddDropdown({
Name = "Custom Masked",
Locked = false,
TextLocked = "Premium Required",
Flag = "Custom Masked",
Values = customMaskedMasks,
Multi = false,
Default = VD.KILLER_CustomMasked or "Richard",
Callback = function(v)
if v and false then
return
end
if type(v) == "table" then
v = v[1]
end
VD.KILLER_CustomMasked = v or "Richard"
end
})
abilityKiller:AddButton({
Name = "Apply Custom Masked",
Locked = false,
TextLocked = "Premium Required",
Callback = function()
if false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Custom Masked hanya untuk pengguna Key Premium!", 5)
return
end
pcall(KYS_ApplyCustomMasked, VD.KILLER_CustomMasked)
end
})
abilityKiller:AddButton({
Name = "Random Custom Masked",
Locked = false,
TextLocked = "Premium Required",
Callback = function()
if false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Custom Masked hanya untuk pengguna Key Premium!", 5)
return
end
local mask = customMaskedMasks[math.random(1, #customMaskedMasks)]
VD.KILLER_CustomMasked = mask
pcall(KYS_ApplyCustomMasked, mask)
end
})
end)
local utilKiller = MainKillerFeatureTabs.Utilities:AddSection({
Position = "Center",
Name = "Utilities",
Icon = "solar:settings-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
utilKiller:AddToggle({ Default = false, Name = "Auto Hook", Flag = "Auto Hook", Callback = function(v) VD.KILLER_AutoHook = v end })
utilKiller:AddToggle({ Default = false, Name = "Destroy Pallets", Flag = "Destroy Pallets", Callback = function(v) VD.KILLER_DestroyPallets = v end })
utilKiller:AddToggle({ Default = false, Name = "Auto Kick Generator", Flag = "Auto Kick Generator", Callback = function(v) VD.KILLER_AutoBreakGene = v end })
utilKiller:AddToggle({ Default = false, Name = "Block All Vaults", Locked = false, TextLocked = "Premium Required", Flag = "Block All Vaults", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Block All Vaults hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_BlockVaults = v
end })
utilKiller:AddToggle({ Default = false, Name = "Auto Drop All Pallets", Locked = false, TextLocked = "Premium Required", Flag = "Auto Drop All Pallets", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Auto Drop All Pallets hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_BlockPallets = v
end })
utilKiller:AddToggle({ Default = false, Name = "Break All Pallet", Locked = false, TextLocked = "Premium Required", Flag = "Break All Pallet", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Break All Pallet hanya untuk pengguna Key Premium!", 5)
return
end
VD.KILLER_BlockPalletDrop = v
end })
utilKiller:AddToggle({
Default = false,
Name = "Anti Blind (Flashlight)", Flag = "Anti Blind (Flashlight)",
Callback = function(v)
VD.KILLER_AntiBlind = v; pcall(SetupAntiBlind)
end
})
utilKiller:AddToggle({
Default = false,
Name = "Remove Palletwrong (All)", Flag = "Remove Palletwrong (All)",
Callback = function(v)
VD.KILLER_NoPalletStun = v; pcall(SetupNoPalletStun)
end
})
utilKiller:AddToggle({ Default = false, Name = "No Slowdown", Flag = "No Slowdown", Callback = function(v) VD.KILLER_NoSlowdown = v end })
utilKiller:AddToggle({ Default = false, Name = "Beat Killer (auto kill)", Flag = "Beat Killer (auto kill)", Callback = function(v) VD.BEAT_Killer = v end })
utilKiller:AddDivider({ Text = "Target Lock" })
utilKiller:AddToggle({ Default = false, Name = "Target Lock", Flag = "Target Lock", Callback = function(v)
if getgenv().VD_SetAimLockButtonVisible then
getgenv().VD_SetAimLockButtonVisible(v)
else
VD.AimLockButton = v
end
end })
utilKiller:AddToggle({ Default = false, Name = "Lock Target Lock Button", Flag = "Lock Target Lock Button", Callback = function(v)
VD.AimLockButtonLocked = v and true or false
end })
utilKiller:AddSlider({
Name = "Target Lock Max Distance", Flag = "Target Lock Max Distance",
Min = 10, Max = 200, Default = 50,
Callback = function(v)
VD.AimLockMaxDistance = v
end
})
end
do -- Escape Tab
local escapeSurv = MainFeatureTabs.Escape:AddSection({
Position = "Center",
Name = "Escape",
Icon = "solar:exit-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
escapeSurv:AddToggle({ Default = false, Name = "Bypass Gate", Flag = "Bypass Gate", Callback = function(v) VD.BypassGate = v; if not v then pcall(VD_RestoreGateParts) end end })
escapeSurv:AddToggle({ Default = false, Name = "Beat Survivor (auto exit)", Locked = false, TextLocked = "Premium Required", Flag = "Beat Survivor (auto exit)", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Beat Survivor hanya untuk pengguna Key Premium!", 5)
return
end
VD.BEAT_Survivor = v
end })
escapeSurv:AddToggle({ Default = false, Name = "Flee Killer", Flag = "Flee Killer", Callback = function(v) VD.SURV_FleeKiller = v end })
escapeSurv:AddSlider({
Name = "Flee Distance", Flag = "Flee Distance",
Min = 15, Max = 80, Default = 40,
Callback = function(v) VD.SURV_FleeDistance = v end
})
end
do -- Generator Tab
-- removed GeneratorTab AddDivider
local genAuto = MainFeatureTabs.Automation:AddSection({
Position = "Center",
Name = "Automation",
Icon = "solar:bolt-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
genAuto:AddToggle({ Default = false, Name = "Auto Skillcheck", Flag = "Auto Skillcheck", Callback = function(v) VD_SetAutoSkillcheck(v) end })
genAuto:AddToggle({ Default = false, Name = "Hide Skillcheck UI", Flag = "Hide Skillcheck UI", Callback = function(v) VD.HideSkillUI = v end })
genAuto:AddToggle({ Default = false, Name = "Boost Gen Bypass", Locked = false, TextLocked = "Premium Required", Flag = "Boost Gen Bypass", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Boost Gen Bypass hanya untuk pengguna Key Premium!", 5)
return
end
setGenBypass(v)
end })
genAuto:AddDropdown({
Name = "Skillcheck Mode",
Flag = "Skillcheck Mode",
Values = { "Normal", "Perfect", "Instant" },
Default = "Normal",
DisabledOptions = false and { "Instant" } or {},
Multi = false,
Callback = function(option)
if type(option) == "table" then option = option[1] end
if option == "Instant" and false then
pcall(VD_Notify, "Premium Required ✨", "Opsi Instant hanya untuk pengguna Key Premium!", 5)
return
end
VD.AutoSkillcheckMode = option or "Normal"
if VD.AutoSkillcheckMode ~= "Instant" and AutoSkill.InstantRotationConnection then
AutoSkill.InstantRotationConnection:Disconnect()
AutoSkill.InstantRotationConnection = nil
AutoSkill.InstantHasClicked = false
end
VD_Notify("Skillcheck Mode", tostring(VD.AutoSkillcheckMode) .. " selected", 2)
end
})
end
do -- Fling Tab
local flingSection = PlayerFeatureTabs.Fling:AddSection({
Position = "Center",
Name = "Fling",
Icon = "solar:wind-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
flingSection:AddToggle({ Default = false, Name = "Enable Fling", Locked = false, TextLocked = "Premium Required", Flag = "Enable Fling", Callback = function(v)
if v and false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Fling hanya untuk pengguna Key Premium!", 5)
return
end
VD.FLING_Enabled = v
end })
flingSection:AddSlider({
Name = "Fling Strength", Flag = "Fling Strength",
Min = 1000, Max = 50000, Default = 10000,
Callback = function(
v)
VD.FLING_Strength = v
end
})
-- removed FlingTab AddDivider
flingSection:AddButton({ Name = "Fling Nearest", Locked = false, TextLocked = "Premium Required", Callback = function()
if false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Fling hanya untuk pengguna Key Premium!", 5)
return
end
pcall(function() KYS_FlingNearest() end)
end })
flingSection:AddButton({ Name = "Fling All", Locked = false, TextLocked = "Premium Required", Callback = function()
if false then
pcall(VD_Notify, "Premium Required ✨", "Fitur Fling hanya untuk pengguna Key Premium!", 5)
return
end
pcall(KYS_FlingAll)
end })
end
-- =====================================================
-- PLAYER EMOTE SYSTEM (Logic from PanduHub1.lua)
-- =====================================================
local SelectedAnim = "rbxassetid://83229063951016"
local SelectedSound = "rbxassetid://85355610204255"
local currentTrack = nil
local currentSound = nil
local EmoteOptions = {
"Friday Night",
"WarCry",
"24 Hour Cinderella",
"Applause",
"Arm Swing",
"Backflip",
"California Girls",
"Christmas Spirit",
"Floating Rest",
"Ghoul",
"Griddy",
"Kyoufuu",
"OnePlays",
"Vulnerable",
}
local function SelectEmoteData(value)
if value == "Friday Night" then
SelectedAnim = "rbxassetid://83229063951016"
SelectedSound = "rbxassetid://85355610204255"
elseif value == "WarCry" then
SelectedAnim = "rbxassetid://82600868380136"
SelectedSound = "rbxassetid://120101930689931"
elseif value == "24 Hour Cinderella" then
SelectedAnim = "rbxassetid://137195203725366"
SelectedSound = "rbxassetid://121099446613414"
elseif value == "Applause" then
SelectedAnim = "rbxassetid://96328361165090"
SelectedSound = "rbxassetid://115490787020749"
elseif value == "Arm Swing" then
SelectedAnim = "rbxassetid://80552139463944"
SelectedSound = "rbxassetid://74216458932348"
elseif value == "Backflip" then
SelectedAnim = "rbxassetid://74705617908505"
SelectedSound = nil
elseif value == "California Girls" then
SelectedAnim = "rbxassetid://123552803041504"
SelectedSound = "rbxassetid://87899327891544"
elseif value == "Christmas Spirit" then
SelectedAnim = "rbxassetid://137859761110514"
SelectedSound = nil
elseif value == "Floating Rest" then
SelectedAnim = "rbxassetid://114593021219597"
SelectedSound = nil
elseif value == "Ghoul" then
SelectedAnim = "rbxassetid://130415594909401"
SelectedSound = "rbxassetid://123004139176580"
elseif value == "Griddy" then
SelectedAnim = "rbxassetid://75586690784894"
SelectedSound = nil
elseif value == "Kyoufuu" then
SelectedAnim = "rbxassetid://137322894494527"
SelectedSound = "rbxassetid://129064643026442"
elseif value == "OnePlays" then
SelectedAnim = "rbxassetid://140625405103474"
SelectedSound = "rbxassetid://94749073728335"
elseif value == "Vulnerable" then
SelectedAnim = "rbxassetid://121773684313913"
SelectedSound = "rbxassetid://135265751184744"
end
end
local function PlayEmote()
local char = LocalPlayer.Character
if not char then return end
local hum = char:FindFirstChildOfClass("Humanoid")
local hrp = char:FindFirstChild("HumanoidRootPart")
if not hum or not hrp then return end
if currentTrack then
currentTrack:Stop()
currentTrack = nil
end
if currentSound then
currentSound:Destroy()
currentSound = nil
end
if SelectedAnim then
local anim = Instance.new("Animation")
anim.AnimationId = SelectedAnim
currentTrack = hum:LoadAnimation(anim)
currentTrack.Looped = true
currentTrack:Play()
end
if SelectedSound then
currentSound = Instance.new("Sound")
currentSound.SoundId = SelectedSound
currentSound.Looped = true
currentSound.Volume = 2
currentSound.Parent = hrp
currentSound:Play()
end
end
local function StopEmote()
if currentTrack then
currentTrack:Stop()
currentTrack = nil
end
if currentSound then
currentSound:Destroy()
currentSound = nil
end
end
do -- Emote Tab
local emoteSection = PlayerFeatureTabs.Emote:AddSection({
Position = "Center",
Name = "Player Emote [BETA]",
Icon = "solar:music-note-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
VD.SelectedEmote = "Friday Night"
VD.EmoteEnabled = false
emoteSection:AddToggle({
Default = false,
Name = "Enable Emote",
Flag = "Enable Emote",
Callback = function(v)
VD.EmoteEnabled = v
if v then
PlayEmote()
else
StopEmote()
end
end
})
emoteSection:AddDropdown({
Name = "Select Emote",
Flag = "Select Emote",
Values = EmoteOptions,
Default = "Friday Night",
Multi = false,
Callback = function(option)
if type(option) == "table" then option = option[1] end
VD.SelectedEmote = option or "Friday Night"
SelectEmoteData(VD.SelectedEmote)
if VD.EmoteEnabled then
PlayEmote()
end
end
})
end
do -- Fun Tab
local funSection = PlayerMiscFeatureTabs.Fun:AddSection({
Position = "Center",
Name = "Spoof Stats [Visual Only]",
Icon = "solar:gamepad-bold",
Box = true,
BoxBorder = true,
Opened = true,
})
local spoofLevel, spoofGears, spoofScrews = "0", "0", "0"
funSection:AddTextInput({
Name = "Set Level",
Flag = "SpoofLevel",
Numeric = true,
Default = "0",
Callback = function(value) spoofLevel = value end
})
funSection:AddTextInput({
Name = "Set Gears",
Flag = "SpoofGears",
Numeric = true,
Default = "0",
Callback = function(value) spoofGears = value end
})
funSection:AddTextInput({
Name = "Set Screws",
Flag = "SpoofScrews",
Numeric = true,
Default = "0",
Callback = function(value) spoofScrews = value end
})
funSection:AddButton({
Name = "Apply Spoof Data",
Callback = function()
local p = LocalPlayer
if p then
p:SetAttribute("Level", tonumber(spoofLevel) or 0)
p:SetAttribute("Gears", tonumber(spoofGears) or 0)
p:SetAttribute("Screws", tonumber(spoofScrews) or 0)
if VD_Notify then
VD_Notify("Spoof Data", "Level, Gears, dan Screws diperbarui", 3)
end
end
end
})
end
do -- Streamer Mode Tab
local streamerSection = PlayerMiscFeatureTabs.Streamer:AddSection({
Position = "Center",
Name = "Streamer Mode",
Icon = "solar:users-group-rounded-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
local FakeNameConnection = nil
local function shouldHideNameObject(object)
local ok, isTextObj = pcall(function()
return object:IsA("TextLabel") or object:IsA("TextButton") or object:IsA("TextBox")
end)
if not ok or not isTextObj then
return false
end
local text = ""
pcall(function() text = tostring(object.Text or "") end)
return text == LocalPlayer.Name or text == LocalPlayer.DisplayName or text:find(LocalPlayer.Name, 1, true) ~= nil
end
local function enableFakeName(enabled)
if FakeNameConnection then
pcall(function() FakeNameConnection:Disconnect() end)
FakeNameConnection = nil
end
local playerGui = LocalPlayer:FindFirstChildOfClass("PlayerGui")
if not playerGui then
return
end
local function process(object)
if shouldHideNameObject(object) then
object.Visible = not enabled
end
end
for _, descendant in ipairs(playerGui:GetDescendants()) do
process(descendant)
end
if enabled then
FakeNameConnection = playerGui.DescendantAdded:Connect(function(object)
task.defer(process, object)
end)
end
end
streamerSection:AddToggle({
Default = false,
Name = "Hide Name",
Flag = "Hide Name",
Callback = function(v)
pcall(enableFakeName, v)
end
})
end
local KorlessMorph = {
Connection = nil
}
local function ApplyKorless()
local function Morph()
repeat task.wait()
until LocalPlayer.Character
and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
and LocalPlayer.Character:FindFirstChild("Right Leg")
task.wait(0.1)
local char = LocalPlayer.Character
pcall(function()
char.Head.Transparency = 1
local face = char.Head:FindFirstChild("face")
if face then
face:Destroy()
end
char["Right Leg"].Transparency = 1
local mesh = Instance.new("MeshPart")
mesh.Name = "KorlessHead"
mesh.Size = Vector3.new(1.5, 1.5, 1.5)
mesh.CanCollide = false
mesh.MeshId = "rbxassetid://902942096"
mesh.TextureID = "rbxassetid://902843398"
mesh.CFrame = char["Right Leg"].CFrame * CFrame.new(0, 0.5, 0)
mesh.Parent = char
local weld = Instance.new("WeldConstraint")
weld.Part0 = char["Right Leg"]
weld.Part1 = mesh
weld.Parent = mesh
end)
end
Morph()
if KorlessMorph.Connection then
KorlessMorph.Connection:Disconnect()
end
KorlessMorph.Connection = LocalPlayer.CharacterAdded:Connect(function()
task.wait(1)
Morph()
end)
end
do -- Korless Tab
local avatarSection = PlayerMiscFeatureTabs.Avatar:AddSection({
Position = "Center",
Name = "Korless Morph",
Icon = "solar:users-group-rounded-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
avatarSection:AddButton({
Name = "APPLY KORLESS",
Callback = function()
ApplyKorless()
VD_Notify("Korless Morph", "Korless Morph Applied successfully!", 3)
end
})
avatarSection:AddButton({
Name = "RESET KORLESS",
Callback = function()
if KorlessMorph.Connection then
pcall(function() KorlessMorph.Connection:Disconnect() end)
KorlessMorph.Connection = nil
end
pcall(function()
local korHead = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("KorlessHead")
if korHead then korHead:Destroy() end
end)
VD_Notify("Korless Morph", "Korless Morph berhasil direset!", 3)
end
})
end
end -- end if Window then
print("KYS HUB Violence District v1.5.6 Loaded")
pcall(function()
VD_Notify("KysHub", "Violence District v1.5.6 Loaded Successfully!", 5)
end)
-- =====================================================
-- ROLE HELPERS
-- =====================================================
function GetRole()
if not LocalPlayer.Team then return "Unknown" end
local name = LocalPlayer.Team.Name
if name == "Killer" then return "Killer" end
if name == "Survivors" then return "Survivor" end
return "Lobby"
end
function IsKiller(player)
return player and player.Team and player.Team.Name == "Killer"
end
function IsSurvivor(player)
return player and player.Team and player.Team.Name == "Survivors"
end
function KYS_ApplyCustomMasked(maskName)
local selectedMask = maskName or VD.KILLER_CustomMasked or "Richard"
if type(selectedMask) == "table" then
selectedMask = selectedMask[1]
end
if type(selectedMask) ~= "string" or selectedMask == "" then
selectedMask = "Richard"
end
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local killers = remotes and remotes:FindFirstChild("Killers")
local masked = killers and killers:FindFirstChild("Masked")
local activatePower = masked and masked:FindFirstChild("Activatepower")
if activatePower and activatePower:IsA("RemoteEvent") then
activatePower:FireServer(selectedMask)
return true
end
return false
end
function VD_GetGameValue(obj, name)
if typeof(obj) ~= "Instance" then return nil end
local attr = obj:GetAttribute(name)
if attr ~= nil then return attr end
local child = obj:FindFirstChild(name)
if child and child:IsA("ValueBase") then return child.Value end
return nil
end
function VD_IsStatusActive(value)
return value == true or (type(value) == "number" and value > 0)
end
function VD_RunAntiKnock()
if not VD.SURV_AntiKnock or GetRole() ~= "Survivor" then return end
local char = LocalPlayer.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local root = char and char:FindFirstChild("HumanoidRootPart")
if not char or not hum then return end
local isKnocked = VD_IsStatusActive(VD_GetGameValue(char, "Knocked"))
or VD_IsStatusActive(VD_GetGameValue(char, "IsKnocked"))
local isCarried = VD_IsStatusActive(VD_GetGameValue(char, "Carried"))
or VD_IsStatusActive(VD_GetGameValue(char, "IsCarried"))
or VD_IsStatusActive(VD_GetGameValue(char, "Grabbed"))
if not isKnocked and not isCarried then return end
local now = tick()
if VD._LastAntiKnock and now - VD._LastAntiKnock < 0.3 then return end
VD._LastAntiKnock = now
for _, flag in ipairs({ "Knocked", "IsKnocked", "Carried", "IsCarried", "Grabbed", "Ragdolled", "Captured", "Disabled" }) do
pcall(function()
if char:GetAttribute(flag) ~= nil then char:SetAttribute(flag, false) end
local obj = char:FindFirstChild(flag)
if obj and obj:IsA("BoolValue") then
obj.Value = false
elseif obj and (obj:IsA("NumberValue") or obj:IsA("IntValue")) then
obj.Value = 0
end
end)
end
pcall(function()
hum.PlatformStand = false
hum.Sit = false
hum.AutoRotate = true
if hum:GetState() == Enum.HumanoidStateType.Physics
or hum:GetState() == Enum.HumanoidStateType.Ragdoll
or hum:GetState() == Enum.HumanoidStateType.FallingDown
or hum:GetState() == Enum.HumanoidStateType.PlatformStanding then
hum:ChangeState(Enum.HumanoidStateType.GettingUp)
end
if root then root.AssemblyLinearVelocity = Vector3.zero end
task.defer(function()
pcall(function()
hum.Health = hum.MaxHealth
hum.WalkSpeed = math.max(hum.WalkSpeed, 16)
hum:ChangeState(Enum.HumanoidStateType.Running)
end)
end)
end)
end
function VD_ClearSurvivorWarnings()
for _, player in ipairs(Players:GetPlayers()) do
local char = player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
local warn = root and root:FindFirstChild("KYS_SurvivorKillerWarn")
if warn then warn:Destroy() end
end
end
local VD_WarnIconPaths = {
Yellow = "/tmp/codex-web-uploads/f-LtzTRl/file_000000004f9871fa9d73773e3af21740.png",
red = "/tmp/codex-web-uploads/f-Yo5gYu/file_00000000fb90720782fb54bce5fe8099.png",
}
local VD_WarnIconAssetIds = {
Yellow = "113063284092207",
red = "87337602602637",
}
local VD_WarnIconCache = {}
function VD_FormatAssetId(assetId)
assetId = tostring(assetId or "")
if assetId == "" then return nil end
if assetId:find("rbxassetid://", 1, true) then return assetId end
if assetId:find("rbxthumb://", 1, true) then return assetId end
if assetId:match("^%d+$") then
return "rbxthumb://type=Asset&id=" .. assetId .. "&w=150&h=150"
end
return "rbxassetid://" .. assetId
end
function VD_GetWarnIcon(colorName, path)
local asset = VD_FormatAssetId(VD_WarnIconAssetIds[colorName])
if asset then return asset end
if VD_WarnIconCache[path] ~= nil then return VD_WarnIconCache[path] or nil end
if not getcustomasset then
VD_WarnIconCache[path] = false
return nil
end
local ok, asset = pcall(getcustomasset, path)
VD_WarnIconCache[path] = ok and asset or false
return VD_WarnIconCache[path] or nil
end
function VD_EnsureWarnImage(parent, name, image, position)
local img = parent:FindFirstChild(name)
if not img then
img = Instance.new("ImageLabel")
img.Name = name
img.BackgroundTransparency = 1
img.ImageTransparency = 0
img.ScaleType = Enum.ScaleType.Fit
img.ZIndex = 2
img.Parent = parent
end
img.Image = image or ""
img.Position = position or UDim2.fromScale(0, 0)
img.Size = UDim2.fromScale(0.5, 1)
img.Visible = image ~= nil
return img
end
function VD_UpdateSurvivorWarnings()
if not VD.SURV_WarnKiller then
if VD._WarnKillerActive then
VD_ClearSurvivorWarnings()
VD._WarnKillerActive = false
end
return
end
local now = tick()
if VD._WarnKillerKyst and now < VD._WarnKillerKyst then return end
VD._WarnKillerKyst = now + 0.15
VD._WarnKillerActive = true
local killers = {}
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsKiller(player) and player.Character then
local root = player.Character:FindFirstChild("HumanoidRootPart")
local hum = player.Character:FindFirstChildOfClass("Humanoid")
if root and hum and hum.Health > 0 then table.insert(killers, root) end
end
end
for _, player in ipairs(Players:GetPlayers()) do
if IsSurvivor(player) and player.Character then
local char = player.Character
local root = char:FindFirstChild("HumanoidRootPart")
local hum = char:FindFirstChildOfClass("Humanoid")
if root and hum and hum.Health > 0 then
local nearest = math.huge
for _, killerRoot in ipairs(killers) do
nearest = math.min(nearest, (root.Position - killerRoot.Position).Magnitude)
end
local warn = root:FindFirstChild("KYS_SurvivorKillerWarn")
if nearest <= 60 then
local danger = nearest <= 40
if not warn then
warn = Instance.new("BillboardGui")
warn.Name = "KYS_SurvivorKillerWarn"
warn.Adornee = root
warn.AlwaysOnTop = true
warn.Size = UDim2.new(0, 76, 0, 44)
warn.StudsOffset = Vector3.new(0, 4.8, 0)
warn.MaxDistance = 2000
warn.Parent = root
local label = Instance.new("TextLabel")
label.Name = "FallbackLabel"
label.BackgroundTransparency = 1
label.Size = UDim2.fromScale(1, 1)
label.Font = Enum.Font.GothamBlack
label.TextScaled = true
label.Visible = false
label.Parent = warn
local stroke = Instance.new("UIStroke")
stroke.Thickness = 1.5
stroke.Color = Color3.new(0, 0, 0)
stroke.Parent = label
end
local yellowIcon = VD_GetWarnIcon("Yellow", VD_WarnIconPaths.Yellow)
local purpleIcon = VD_GetWarnIcon("Red", VD_WarnIconPaths.red)
local canUseImages = yellowIcon ~= nil and (not danger or purpleIcon ~= nil)
warn.Size = danger and UDim2.new(0, 76, 0, 56) or UDim2.new(0, 56, 0, 56)
local yellow = VD_EnsureWarnImage(warn, "YellowIcon", yellowIcon, UDim2.fromScale(0, 0))
local purple = VD_EnsureWarnImage(warn, "redIcon", purpleIcon, UDim2.fromScale(0.38, 0))
yellow.Size = danger and UDim2.fromScale(0.62, 1) or UDim2.fromScale(1, 1)
purple.Size = UDim2.fromScale(0.62, 1)
yellow.Visible = canUseImages
purple.Visible = canUseImages and danger
local label = warn:FindFirstChild("FallbackLabel")
if label then
label.Visible = not canUseImages
label.Text = danger and "!!" or "!"
label.TextColor3 = danger and Color3.fromRGB(255, 40, 40) or Color3.fromRGB(255, 225, 0)
end
elseif warn then
warn:Destroy()
end
end
end
end
end
local VD_GateOriginal = setmetatable({}, { __mode = "k" })
function VD_SetPartState(part, props)
if not part or not part:IsA("BasePart") then return end
if not VD_GateOriginal[part] then
VD_GateOriginal[part] = {
Transparency = part.Transparency,
CanCollide = part.CanCollide,
}
end
pcall(function()
if props.Transparency ~= nil then part.Transparency = props.Transparency end
if props.CanCollide ~= nil then part.CanCollide = props.CanCollide end
end)
end
function VD_RestoreGateParts()
for part, props in pairs(VD_GateOriginal) do
if part and part.Parent then
pcall(function()
part.Transparency = props.Transparency
part.CanCollide = props.CanCollide
end)
end
end
VD_GateOriginal = setmetatable({}, { __mode = "k" })
end
function VD_UpdateBypassGate()
if not VD.BypassGate then
if next(VD_GateOriginal) then VD_RestoreGateParts() end
return
end
if VD._KystBypassGate and tick() < VD._KystBypassGate then return end
VD._KystBypassGate = tick() + 1
for _, gate in ipairs(Workspace:GetDescendants()) do
if gate:IsA("Model") and gate.Name == "Gate" then
VD_SetPartState(gate:FindFirstChild("LeftGate"), { Transparency = 1, CanCollide = false })
VD_SetPartState(gate:FindFirstChild("RightGate"), { Transparency = 1, CanCollide = false })
VD_SetPartState(gate:FindFirstChild("LeftGate-end"), { Transparency = 0, CanCollide = true })
VD_SetPartState(gate:FindFirstChild("RightGate-end"), { Transparency = 0, CanCollide = true })
VD_SetPartState(gate:FindFirstChild("Box"), { CanCollide = false })
end
end
end
local VD_InvisibleNV = {
Active = false,
Seat = nil,
Weld = nil,
OriginalSpeed = nil,
Position = Vector3.new(-25.95, 84, 3537.55),
}
function VD_SetCharacterTransparency(character, transparency)
for _, descendant in ipairs(character:GetDescendants()) do
if (descendant:IsA("BasePart") or descendant:IsA("Decal")) and descendant.Name ~= "HumanoidRootPart" then
pcall(function() descendant.Transparency = transparency end)
end
end
end
function VD_SetInvisibleNotVisual(state)
local char = LocalPlayer.Character
if not char then return end
local hum = char:FindFirstChildOfClass("Humanoid")
local root = char:FindFirstChild("HumanoidRootPart")
local torso = char:FindFirstChild("Torso") or char:FindFirstChild("UpperTorso")
if not hum or not root or not torso then return end
if state then
if VD_InvisibleNV.Active then
hum.WalkSpeed = VD.InvisibleSpeed or 16
return
end
VD_InvisibleNV.Active = true
VD_InvisibleNV.OriginalSpeed = hum.WalkSpeed
local savedCFrame = root.CFrame
char:MoveTo(VD_InvisibleNV.Position)
task.wait(0.15)
local seat = Instance.new("Seat")
seat.Name = "KYS_InvisibleSeat"
seat.Anchored = false
seat.CanCollide = false
seat.Transparency = 1
seat.CFrame = CFrame.new(VD_InvisibleNV.Position)
seat.Parent = Workspace
local weld = Instance.new("Weld")
weld.Part0 = seat
weld.Part1 = torso
weld.Parent = seat
VD_InvisibleNV.Seat = seat
VD_InvisibleNV.Weld = weld
task.wait()
seat.CFrame = savedCFrame
VD_SetCharacterTransparency(char, 0.5)
hum.WalkSpeed = VD.InvisibleSpeed or 16
else
VD.InvisibleNotVisual = false
VD_InvisibleNV.Active = false
if VD_InvisibleNV.Seat and VD_InvisibleNV.Seat.Parent then
pcall(function() VD_InvisibleNV.Seat:Destroy() end)
end
VD_InvisibleNV.Seat = nil
VD_InvisibleNV.Weld = nil
VD_SetCharacterTransparency(char, 0)
if VD_InvisibleNV.OriginalSpeed then
hum.WalkSpeed = VD_InvisibleNV.OriginalSpeed
end
VD_InvisibleNV.OriginalSpeed = nil
end
end
local VD_OriginalLungeBoost = nil
function VD_UpdateInfiniteLunge()
local char = LocalPlayer.Character
if not char then return end
if VD.KILLER_InfLunge then
if char:GetAttribute("lungeboost") ~= 999999 then
VD_OriginalLungeBoost = char:GetAttribute("lungeboost") or 1
char:SetAttribute("lungeboost", 999999)
end
else
if VD_OriginalLungeBoost then
char:SetAttribute("lungeboost", VD_OriginalLungeBoost)
VD_OriginalLungeBoost = nil
end
end
end
function VD_UpdateInvisibleNotVisual()
if not VD.InvisibleNotVisual then
if VD_InvisibleNV.Active then VD_SetInvisibleNotVisual(false) end
return
end
VD_SetInvisibleNotVisual(true)
end
local VD_MoonwalkState = {
LastEnabled = false,
Yaw = nil,
Sway = 0,
ButtonGui = nil,
Button = nil,
ButtonLabel = nil,
SyncingUI = false,
}
function VD_RefreshMoonwalkButton()
local btn = VD_MoonwalkState.Button
if not (btn and btn.Parent) then return end
btn.BackgroundColor3 = VD.Moonwalk and Color3.fromRGB(35, 185, 95) or Color3.fromRGB(20, 0, 30)
local label = VD_MoonwalkState.ButtonLabel
if label and label.Parent then
label.Text = VD.Moonwalk and "ON" or "OFF"
label.TextColor3 = VD.Moonwalk and Color3.fromRGB(190, 255, 210) or Color3.fromRGB(255, 255, 255)
end
end
function VD_SetMoonwalk(state)
VD.Moonwalk = state and true or false
VD_RefreshMoonwalkButton()
end
getgenv().VD_SetMoonwalk = VD_SetMoonwalk
function VD_DestroyMoonwalkButton()
if VD_MoonwalkState.ButtonGui then
pcall(function() VD_MoonwalkState.ButtonGui:Destroy() end)
end
VD_MoonwalkState.ButtonGui = nil
VD_MoonwalkState.Button = nil
VD_MoonwalkState.ButtonLabel = nil
end
function VD_CreateMoonwalkButton()
local parent = LocalPlayer:FindFirstChild("PlayerGui") or LocalPlayer:WaitForChild("PlayerGui", 10)
if not parent then
task.delay(1, VD_CreateMoonwalkButton)
return
end
if VD_MoonwalkState.ButtonGui and VD_MoonwalkState.ButtonGui.Parent then
VD_RefreshMoonwalkButton()
return
end
local old = parent:FindFirstChild("KYS_MoonwalkButton")
if old then pcall(function() old:Destroy() end) end
local sg = Instance.new("ScreenGui")
sg.Name = "KYS_MoonwalkButton"
sg.ResetOnSpawn = false
sg.IgnoreGuiInset = true
sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
sg.DisplayOrder = 999999
sg.Parent = parent
local btn = Instance.new("ImageButton")
btn.Name = "MoonwalkButton"
btn.Size = UDim2.new(0, 60, 0, 60)
btn.Position = UDim2.new(0.88, 0, 0.43, 0)
btn.AnchorPoint = Vector2.new(0.5, 0.5)
btn.BackgroundColor3 = Color3.fromRGB(20, 0, 30)
btn.BackgroundTransparency = 0.15
btn.BorderSizePixel = 0
btn.AutoButtonColor = true
btn.Visible = true
btn.ZIndex = 10
btn.Parent = sg
Instance.new("UICorner", btn).CornerRadius = UDim.new(1, 0)
local stroke = Instance.new("UIStroke", btn)
stroke.Color = Color3.fromRGB(255, 255, 255)
stroke.Thickness = 2
stroke.Transparency = 0.2
local lbl = Instance.new("TextLabel", btn)
lbl.Name = "StateLabel"
lbl.Size = UDim2.new(1, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = "OFF"
lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
lbl.TextScaled = true
lbl.Font = Enum.Font.GothamBlack
lbl.ZIndex = 11
local function applyShine(obj, baseColor)
local grad = Instance.new("UIGradient", obj)
grad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, baseColor),
ColorSequenceKeypoint.new(0.4, baseColor),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(255, 255, 255)),
ColorSequenceKeypoint.new(0.6, baseColor),
ColorSequenceKeypoint.new(1, baseColor)
})
grad.Rotation = 45
grad.Offset = Vector2.new(-1, -1)
task.spawn(function()
local TweenService = game:GetService("TweenService")
local ti = TweenInfo.new(2, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1)
local tw = TweenService:Create(grad, ti, { Offset = Vector2.new(1, 1) })
tw:Play()
end)
end
pcall(applyShine, btn, Color3.fromRGB(20, 0, 30))
pcall(applyShine, lbl, Color3.fromRGB(255, 0, 255))
pcall(applyShine, stroke, Color3.fromRGB(255, 0, 255))
local dragging = false
local dragStart, startPos
local moved = false
btn.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
moved = false
if VD.MoonwalkButtonLocked then return end
dragging = true
dragStart = input.Position
startPos = btn.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
UserInputService.InputChanged:Connect(function(input)
if VD.MoonwalkButtonLocked then return end
if not dragging or not dragStart or not startPos then return end
if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch then return end
local delta = input.Position - dragStart
if math.abs(delta.X) > 4 or math.abs(delta.Y) > 4 then moved = true end
btn.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end)
btn.MouseButton1Click:Connect(function()
if moved and not VD.MoonwalkButtonLocked then return end
moved = false
VD_SetMoonwalk(not VD.Moonwalk)
end)
VD_MoonwalkState.ButtonGui = sg
VD_MoonwalkState.Button = btn
VD_MoonwalkState.ButtonLabel = lbl
VD_RefreshMoonwalkButton()
end
function VD_SetMoonwalkButtonVisible(state)
VD.MoonwalkButton = state and true or false
local flagName = VD_To_Flag and VD_To_Flag.MoonwalkButton
local elem = flagName and Window and Window.ConfigElements and Window.ConfigElements[flagName]
if elem and elem.Set and not VD_MoonwalkState.SyncingUI then
VD_MoonwalkState.SyncingUI = true
pcall(function() elem:Set(VD.MoonwalkButton) end)
VD_MoonwalkState.SyncingUI = false
end
if VD.MoonwalkButton then
VD_CreateMoonwalkButton()
else
VD_SetMoonwalk(false)
VD_DestroyMoonwalkButton()
end
end
getgenv().VD_SetMoonwalkButtonVisible = VD_SetMoonwalkButtonVisible
task.spawn(function()
while getgenv().VD and not getgenv().VD.Destroyed do
if VD.MoonwalkButton and not (VD_MoonwalkState.ButtonGui and VD_MoonwalkState.ButtonGui.Parent) then
pcall(VD_CreateMoonwalkButton)
elseif VD.MoonwalkButton then
VD_RefreshMoonwalkButton()
elseif VD_MoonwalkState.ButtonGui then
VD_DestroyMoonwalkButton()
end
task.wait(3)
end
end)
-- =====================================================
-- AIM LOCK - External Toggle Button + Logic
-- =====================================================
do
local VD_AimLockState = {
Active = false,
CurrentTarget = nil,
ButtonGui = nil,
Button = nil,
ButtonLabel = nil,
SyncingUI = false,
}
local function VD_AimLock_IsSurvivor(p)
return p.Team and p.Team.Name == "Survivors"
end
local function VD_AimLock_IsDowned(character)
if not character then return true end
if character:GetAttribute("Knocked") == true then return true end
if character:GetAttribute("IsHooked") == true then return true end
local hum = character:FindFirstChild("Humanoid")
if hum and hum.Health <= 0 then return true end
return false
end
local function VD_AimLock_GetClosest()
local char = LocalPlayer.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if not hrp then return nil end
local maxDist = VD.AimLockMaxDistance or 50
local bestTarget = nil
local bestDistance = maxDist + 1
for _, otherPlayer in ipairs(Players:GetPlayers()) do
if otherPlayer ~= LocalPlayer and otherPlayer.Character and VD_AimLock_IsSurvivor(otherPlayer) then
if not VD_AimLock_IsDowned(otherPlayer.Character) then
local otherHrp = otherPlayer.Character:FindFirstChild("HumanoidRootPart")
local otherHum = otherPlayer.Character:FindFirstChild("Humanoid")
if otherHrp and otherHum and otherHum.Health > 0 then
local distance = (otherHrp.Position - hrp.Position).Magnitude
if distance <= maxDist and distance < bestDistance then
bestDistance = distance
bestTarget = otherHrp
end
end
end
end
end
return bestTarget
end
local function VD_RefreshAimLockButton()
local btn = VD_AimLockState.Button
if not (btn and btn.Parent) then return end
btn.BackgroundColor3 = VD_AimLockState.Active and Color3.fromRGB(185, 50, 50) or Color3.fromRGB(20, 0, 30)
local label = VD_AimLockState.ButtonLabel
if label and label.Parent then
label.Text = VD_AimLockState.Active and "ON" or "OFF"
label.TextColor3 = VD_AimLockState.Active and Color3.fromRGB(255, 200, 200) or Color3.fromRGB(255, 255, 255)
end
end
local function VD_SetAimLockActive(state)
VD_AimLockState.Active = state and true or false
if not VD_AimLockState.Active then
VD_AimLockState.CurrentTarget = nil
end
VD_RefreshAimLockButton()
end
getgenv().VD_SetAimLockActive = VD_SetAimLockActive
local function VD_DestroyAimLockButton()
if VD_AimLockState.ButtonGui then
pcall(function() VD_AimLockState.ButtonGui:Destroy() end)
end
VD_AimLockState.ButtonGui = nil
VD_AimLockState.Button = nil
VD_AimLockState.ButtonLabel = nil
end
local function VD_CreateAimLockButton()
local parent = LocalPlayer:FindFirstChild("PlayerGui") or LocalPlayer:WaitForChild("PlayerGui", 10)
if not parent then
task.delay(1, VD_CreateAimLockButton)
return
end
if VD_AimLockState.ButtonGui and VD_AimLockState.ButtonGui.Parent then
VD_RefreshAimLockButton()
return
end
local old = parent:FindFirstChild("KYS_AimLockButton")
if old then pcall(function() old:Destroy() end) end
local sg = Instance.new("ScreenGui")
sg.Name = "KYS_AimLockButton"
sg.ResetOnSpawn = false
sg.IgnoreGuiInset = true
sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
sg.DisplayOrder = 999998
sg.Parent = parent
local btn = Instance.new("ImageButton")
btn.Name = "AimLockButton"
btn.Size = UDim2.new(0, 60, 0, 60)
btn.Position = UDim2.new(0.88, 0, 0.55, 0)
btn.AnchorPoint = Vector2.new(0.5, 0.5)
btn.BackgroundColor3 = Color3.fromRGB(20, 0, 30)
btn.BackgroundTransparency = 0.15
btn.BorderSizePixel = 0
btn.AutoButtonColor = true
btn.Visible = true
btn.ZIndex = 10
btn.Parent = sg
Instance.new("UICorner", btn).CornerRadius = UDim.new(1, 0)
local stroke = Instance.new("UIStroke", btn)
stroke.Color = Color3.fromRGB(255, 70, 70)
stroke.Thickness = 2
stroke.Transparency = 0.2
local lbl = Instance.new("TextLabel", btn)
lbl.Name = "StateLabel"
lbl.Size = UDim2.new(1, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = "OFF"
lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
lbl.TextScaled = true
lbl.Font = Enum.Font.GothamBlack
lbl.ZIndex = 11
local function applyShine(obj, baseColor)
local grad = Instance.new("UIGradient", obj)
grad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, baseColor),
ColorSequenceKeypoint.new(0.4, baseColor),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(255, 255, 255)),
ColorSequenceKeypoint.new(0.6, baseColor),
ColorSequenceKeypoint.new(1, baseColor)
})
grad.Rotation = 45
grad.Offset = Vector2.new(-1, -1)
task.spawn(function()
local TweenService = game:GetService("TweenService")
local ti = TweenInfo.new(2, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1)
local tw = TweenService:Create(grad, ti, { Offset = Vector2.new(1, 1) })
tw:Play()
end)
end
pcall(applyShine, btn, Color3.fromRGB(20, 0, 30))
pcall(applyShine, lbl, Color3.fromRGB(255, 50, 50))
pcall(applyShine, stroke, Color3.fromRGB(255, 50, 50))
local dragging = false
local dragStart, startPos
local moved = false
btn.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
moved = false
if VD.AimLockButtonLocked then return end
dragging = true
dragStart = input.Position
startPos = btn.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
UserInputService.InputChanged:Connect(function(input)
if VD.AimLockButtonLocked then return end
if not dragging or not dragStart or not startPos then return end
if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch then return end
local delta = input.Position - dragStart
if math.abs(delta.X) > 4 or math.abs(delta.Y) > 4 then moved = true end
btn.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end)
btn.MouseButton1Click:Connect(function()
if moved and not VD.AimLockButtonLocked then return end
moved = false
VD_SetAimLockActive(not VD_AimLockState.Active)
end)
VD_AimLockState.ButtonGui = sg
VD_AimLockState.Button = btn
VD_AimLockState.ButtonLabel = lbl
VD_RefreshAimLockButton()
end
local function VD_SetAimLockButtonVisible(state)
VD.AimLockButton = state and true or false
local flagName = VD_To_Flag and VD_To_Flag.AimLockButton
local elem = flagName and Window and Window.ConfigElements and Window.ConfigElements[flagName]
if elem and elem.Set and not VD_AimLockState.SyncingUI then
VD_AimLockState.SyncingUI = true
pcall(function() elem:Set(VD.AimLockButton) end)
VD_AimLockState.SyncingUI = false
end
if VD.AimLockButton then
VD_CreateAimLockButton()
else
VD_SetAimLockActive(false)
VD_DestroyAimLockButton()
end
end
getgenv().VD_SetAimLockButtonVisible = VD_SetAimLockButtonVisible
-- Keybind B untuk toggle Aim Lock
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
if input.KeyCode == Enum.KeyCode.B and VD.AimLockButton then
VD_SetAimLockActive(not VD_AimLockState.Active)
end
end)
-- Reset aim lock saat respawn
LocalPlayer.CharacterAdded:Connect(function()
if VD_AimLockState.Active then
VD_SetAimLockActive(false)
end
VD_AimLockState.CurrentTarget = nil
end)
-- Keep-alive loop untuk Aim Lock button
task.spawn(function()
while getgenv().VD and not getgenv().VD.Destroyed do
if VD.AimLockButton and not (VD_AimLockState.ButtonGui and VD_AimLockState.ButtonGui.Parent) then
pcall(VD_CreateAimLockButton)
elseif VD.AimLockButton then
VD_RefreshAimLockButton()
elseif VD_AimLockState.ButtonGui then
VD_DestroyAimLockButton()
end
task.wait(3)
end
end)
-- Aim Lock update setiap frame (RenderStepped)
RunService.RenderStepped:Connect(function()
if not VD_AimLockState.Active or not VD.AimLockButton then
VD_AimLockState.CurrentTarget = nil
return
end
local targetPart = VD_AimLock_GetClosest()
if not targetPart then
VD_AimLockState.CurrentTarget = nil
return
end
VD_AimLockState.CurrentTarget = targetPart
pcall(function()
local cam = Workspace.CurrentCamera
cam.CFrame = CFrame.new(cam.CFrame.Position, targetPart.Position)
end)
end)
end -- end AimLock scope
function VD_UpdateMoonwalk(deltaTime)
local char = LocalPlayer.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local root = char and char:FindFirstChild("HumanoidRootPart")
local cam = Workspace.CurrentCamera
if VD.Moonwalk ~= VD_MoonwalkState.LastEnabled then
if hum then hum.AutoRotate = not VD.Moonwalk end
VD_MoonwalkState.LastEnabled = VD.Moonwalk
if VD.Moonwalk and root then
local _, y = root.CFrame:ToEulerAnglesYXZ()
VD_MoonwalkState.Yaw = math.deg(y)
end
end
if not VD.Moonwalk then
return
end
if not root or not hum or not cam or hum.Health <= 0 then return end
hum.AutoRotate = false
local look = cam.CFrame.LookVector
local targetYaw = math.deg(math.atan2(look.X, look.Z)) + 180
local currentYaw = VD_MoonwalkState.Yaw or targetYaw
local diff = (targetYaw - currentYaw + 180) % 360 - 180
local lerpSpeed = 0.22 * math.clamp((deltaTime or 1 / 60) * 60, 0, 3)
currentYaw = currentYaw + diff * lerpSpeed
VD_MoonwalkState.Yaw = currentYaw
local moving = hum.MoveDirection.Magnitude > 0.01
local targetSway = 0
if moving then
targetSway = math.sin(tick() * (VD.MoonwalkZigzagSpeed or 11)) * 48
end
VD_MoonwalkState.Sway = (VD_MoonwalkState.Sway or 0) + (targetSway - (VD_MoonwalkState.Sway or 0)) * 0.38
root.CFrame = CFrame.new(root.Position) * CFrame.Angles(0, math.rad(currentYaw + VD_MoonwalkState.Sway), 0)
if moving then
hum:Move(hum.MoveDirection * (VD.MoonwalkBoostPower or 1.08), false)
end
end
LocalPlayer.CharacterRemoving:Connect(function()
if VD_InvisibleNV.Seat and VD_InvisibleNV.Seat.Parent then
pcall(function() VD_InvisibleNV.Seat:Destroy() end)
end
VD_InvisibleNV.Active = false
VD_InvisibleNV.Seat = nil
VD_InvisibleNV.Weld = nil
VD_MoonwalkState.LastEnabled = false
VD_MoonwalkState.Yaw = nil
VD_MoonwalkState.Sway = 0
end)
LocalPlayer.CharacterAdded:Connect(function()
task.wait(1)
if VD.InvisibleNotVisual then pcall(VD_SetInvisibleNotVisual, true) end
end)
local VD_PalletwrongConnection = nil
local VD_PalletwrongScanning = false
function VD_DestroyPalletwrong(inst)
if inst and inst:IsA("Model") and inst.Name == "Palletwrong" then
pcall(function() inst:Destroy() end)
end
end
function VD_StartRemovePalletwrong()
if VD_PalletwrongConnection then return end
VD_PalletwrongConnection = Workspace.DescendantAdded:Connect(function(inst)
if VD.KILLER_NoPalletStun then
VD_DestroyPalletwrong(inst)
end
end)
if VD_PalletwrongScanning then return end
VD_PalletwrongScanning = true
task.spawn(function()
local descendants = Workspace:GetDescendants()
for i, inst in ipairs(descendants) do
if not VD.KILLER_NoPalletStun then break end
VD_DestroyPalletwrong(inst)
if i % 250 == 0 then task.wait() end
end
VD_PalletwrongScanning = false
end)
end
function VD_StopRemovePalletwrong()
if VD_PalletwrongConnection then
pcall(function() VD_PalletwrongConnection:Disconnect() end)
VD_PalletwrongConnection = nil
end
VD_PalletwrongScanning = false
end
function VD_UpdateRemovePalletwrong()
if VD.KILLER_NoPalletStun then
VD_StartRemovePalletwrong()
else
VD_StopRemovePalletwrong()
end
end
do
local vu = game:GetService("VirtualUser")
LocalPlayer.Idled:Connect(function()
if not VD.AntiAFK then return end
pcall(function()
vu:Button2Down(Vector2.new(0, 0), Workspace.CurrentCamera.CFrame)
task.wait(0.2)
vu:Button2Up(Vector2.new(0, 0), Workspace.CurrentCamera.CFrame)
end)
end)
end
-- =====================================================
-- MAP CACHE (Generators / Gates / Hooks / Pallets / Windows)
-- =====================================================
local KYS_Cache = {
Generators = {},
Gates = {},
Hooks = {},
Pallets = {},
Windows = {},
ClosestHook = nil,
ExitPos = nil
}
function KYS_ScanMap()
local map = Workspace:FindFirstChild("Map")
if not map then
KYS_Cache = {
Generators = {}, Zombies = {}, Gates = {}, Hooks = {}, Pallets = {}, Windows = {}, ClosestHook = nil, ExitPos = nil, ExitPart = nil
}
return
end
local newGens, newZombies, newGates, newHooks, newPallets, newWindows = {}, {}, {}, {}, {}, {}
local exitPos = nil
local exitPart = nil
if map:FindFirstChild("churchbell") then
exitPart = map:FindFirstChild("churchbell")
if exitPart:IsA("Model") then exitPart = exitPart.PrimaryPart or exitPart:FindFirstChildWhichIsA("BasePart") end
if exitPart then exitPos = exitPart.Position else exitPos = Vector3.new(760.98, -20.14, -78.48) end
end
local finish = map:FindFirstChild("Finishline") or map:FindFirstChild("FinishLine") or map:FindFirstChild("Fininshline")
if finish then
local fp = finish:IsA("BasePart") and finish or (finish:IsA("Model") and finish:FindFirstChildWhichIsA("BasePart"))
if fp then exitPos = fp.Position; exitPart = fp end
end
for _, obj in ipairs(map:GetDescendants()) do
if obj:IsA("Model") then
local part = obj:FindFirstChild("HitBox", true) or obj:FindFirstChild("GeneratorPoint", true) or obj.PrimaryPart or obj:FindFirstChildWhichIsA("BasePart", true)
if part then
local n = obj.Name
if n == "Generator" then
table.insert(newGens, { model = obj, part = part })
elseif n == "Gate" or n == "ExitGate" or obj:FindFirstChild("ExitLever") then
table.insert(newGates, { model = obj, part = part })
elseif n == "Hook" then
table.insert(newHooks, { model = obj, part = part })
elseif n == "Palletwrong" or n:lower():find("pallet") then
table.insert(newPallets, { model = obj, part = part })
elseif n == "Window" then
table.insert(newWindows, { model = obj, part = part })
end
end
elseif obj:IsA("BasePart") then
if not exitPos and obj.Name:lower():find("finish") then
exitPos = obj.Position
exitPart = obj
end
if not exitPos and obj:IsA("MeshPart") then
if obj.Material == Enum.Material.Limestone then
exitPos = Vector3.new(-947.90, 152.12, -7579.52)
exitPart = obj
elseif obj.Material == Enum.Material.Leather then
exitPos = Vector3.new(1546.12, 152.21, -796.72)
exitPart = obj
end
end
-- Tambahkan VaultTrigger ke cache window jika ditemukan
if obj.Name == "VaultTrigger" then
table.insert(newWindows, { model = obj.Parent, part = obj })
end
-- Tambahkan VaultPoint di dalam VaultTrigger (untuk path workspace.Map.Vaults:GetChildren()[4]:GetChildren()[2].VaultPoint)
if obj.Name == "VaultPoint" and obj.Parent and obj.Parent.Name == "VaultTrigger" then
table.insert(newWindows, { model = obj.Parent, part = obj })
end
-- Tambahkan PalletPoint dan PalletPointSlide ke cache pallet
-- Spy confirmed: server menerima PalletPointSlide sebagai target drop
if obj.Name == "PalletPoint" or obj.Name == "PalletPointSlide" then
table.insert(newPallets, { model = obj.Parent, part = obj })
end
end
end
KYS_Cache.Generators = newGens
KYS_Cache.Gates = newGates
KYS_Cache.Hooks = newHooks
KYS_Cache.Pallets = newPallets
KYS_Cache.Windows = newWindows
KYS_Cache.ExitPos = exitPos
KYS_Cache.ExitPart = exitPart
print("[KYS ScanMap] Generators:", #newGens, "Gates:", #newGates, "Hooks:", #newHooks, "Windows:", #newWindows)
local root = Root
if root and #KYS_Cache.Hooks > 0 then
local closest, closestDist = nil, math.huge
for _, hook in ipairs(KYS_Cache.Hooks) do
if hook.part then
local d = (hook.part.Position - root.Position).Magnitude
if d < closestDist then
closestDist = d; closest = hook
end
end
end
KYS_Cache.ClosestHook = closest
end
end
-- =====================================================
-- RADAR SYSTEM
-- =====================================================
local radarGui = nil
local radarFrame = nil
local radarDots = {}
local radarObjectDots = {}
local RADAR_COLORS = {
Killer = Color3.fromRGB(255, 0, 0), -- Merah untuk Killer
Survivor = Color3.fromRGB(255, 165, 0), -- Oranye untuk Survivor (tim)
Generator = Color3.fromRGB(255, 140, 0),
Gate = Color3.fromRGB(100, 200, 255),
Pallet = Color3.fromRGB(53, 189, 166),
Hook = Color3.fromRGB(252, 116, 116),
Window = Color3.fromRGB(80, 160, 255),
Zombie = Color3.fromRGB(150, 255, 50)
}
local MaskColors = {
Abysswalker = Color3.fromRGB(110, 20, 255),
Cure = Color3.fromRGB(0, 100, 255),
Hidden = Color3.fromRGB(170, 170, 170),
Killer = Color3.fromRGB(255, 40, 40),
Masked = Color3.fromRGB(255, 90, 20),
Stalker = Color3.fromRGB(255, 0, 140),
Veil = Color3.fromRGB(0, 200, 255),
Slasher = Color3.fromRGB(180, 0, 255),
}
function GetKillerColorForRadar(killerPlayer)
return RADAR_COLORS.Killer -- Selalu merah sesuai permintaan
end
function CreateRadarGUI()
local parent = GetSafeGuiParent()
if not parent then return false end
if radarGui then pcall(function() radarGui:Destroy() end) end
radarGui = Instance.new("ScreenGui")
radarGui.Name = "KysHub_RadarGUI"
radarGui.ResetOnSpawn = false
radarGui.IgnoreGuiInset = true
radarGui.Parent = parent
radarFrame = Instance.new("Frame")
radarFrame.Name = "RadarFrame"
radarFrame.Size = UDim2.new(0, VD.RADAR_Size, 0, VD.RADAR_Size)
radarFrame.Position = UDim2.new(0, 10, 0, 120)
radarFrame.BackgroundColor3 = Color3.fromRGB(10, 10, 10)
radarFrame.BackgroundTransparency = 1 - VD.RADAR_Transparency
radarFrame.BorderSizePixel = 0
radarFrame.Active = true
radarFrame.Draggable = true
radarFrame.Parent = radarGui
local corner = Instance.new("UICorner")
corner.CornerRadius = VD.RADAR_Circle and UDim.new(1, 0) or UDim.new(0, 8)
corner.Parent = radarFrame
local stroke = Instance.new("UIStroke")
stroke.Color = Color3.fromRGB(255, 0, 0)
stroke.Thickness = 2
stroke.Parent = radarFrame
local titleText = Instance.new("TextLabel")
titleText.Size = UDim2.new(1, 0, 0, 20)
titleText.BackgroundTransparency = 1
titleText.Text = "KysHub RADAR"
titleText.TextColor3 = Color3.fromRGB(255, 255, 255)
titleText.Font = Enum.Font.SourceSansBold
titleText.TextSize = 12
titleText.Parent = radarFrame
local crossH = Instance.new("Frame")
crossH.Size = UDim2.new(1, -40, 0, 1)
crossH.Position = UDim2.new(0, 20, 0.5, 0)
crossH.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
crossH.BorderSizePixel = 0
crossH.Parent = radarFrame
local crossV = Instance.new("Frame")
crossV.Size = UDim2.new(0, 1, 1, -40)
crossV.Position = UDim2.new(0.5, 0, 0, 20)
crossV.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
crossV.BorderSizePixel = 0
crossV.Parent = radarFrame
local centerDot = Instance.new("Frame")
centerDot.Size = UDim2.new(0, 8, 0, 8)
centerDot.Position = UDim2.new(0.5, -4, 0.5, -4)
centerDot.BackgroundColor3 = Color3.fromRGB(0, 255, 0) -- Hijau untuk kita
centerDot.BorderSizePixel = 0
centerDot.Parent = radarFrame
local centerCorner = Instance.new("UICorner")
centerCorner.CornerRadius = UDim.new(1, 0)
centerCorner.Parent = centerDot
local rangeText = Instance.new("TextLabel")
rangeText.Name = "RangeText"
rangeText.Size = UDim2.new(1, 0, 0, 14)
rangeText.Position = UDim2.new(0, 0, 1, -14)
rangeText.BackgroundTransparency = 1
rangeText.Text = "Range: ".. VD.RADAR_Range.. "m"
rangeText.TextColor3 = Color3.fromRGB(200, 200, 200)
rangeText.Font = Enum.Font.SourceSans
rangeText.TextSize = 10
rangeText.Parent = radarFrame
radarDots = {}
for i = 1, 30 do
local dot = Instance.new("Frame")
dot.Size = UDim2.new(0, 6, 0, 6)
dot.BackgroundColor3 = Color3.fromRGB(255, 65, 65)
dot.BorderSizePixel = 0
dot.Visible = false
dot.Parent = radarFrame
local dotCorner = Instance.new("UICorner")
dotCorner.CornerRadius = UDim.new(1, 0)
dotCorner.Parent = dot
table.insert(radarDots, dot)
end
radarObjectDots = {}
for i = 1, 80 do
local objDot = Instance.new("Frame")
objDot.Size = UDim2.new(0, 4, 0, 4)
objDot.BackgroundColor3 = Color3.fromRGB(255, 180, 50)
objDot.BorderSizePixel = 0
objDot.Visible = false
objDot.Parent = radarFrame
local objCorner = Instance.new("UICorner")
objCorner.CornerRadius = UDim.new(1, 0)
objCorner.Parent = objDot
table.insert(radarObjectDots, objDot)
end
return true
end
function UpdateRadar()
if not VD.RADAR_Enabled then
if radarGui then radarGui.Enabled = false end
return
end
if not radarGui or not radarFrame or not radarGui.Parent then
if not CreateRadarGUI() then return end
end
radarGui.Enabled = true
radarFrame.Visible = true
local camera = workspace.CurrentCamera
local root = Root or (LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart"))
if not camera or not root then return end
radarFrame.Size = UDim2.new(0, VD.RADAR_Size, 0, VD.RADAR_Size)
radarFrame.BackgroundTransparency = 1 - VD.RADAR_Transparency
local corner = radarFrame:FindFirstChildOfClass("UICorner")
if corner then
corner.CornerRadius = VD.RADAR_Circle and UDim.new(1, 0) or UDim.new(0, 8)
end
local rangeText = radarFrame:FindFirstChild("RangeText")
if rangeText then rangeText.Text = "Range: ".. VD.RADAR_Range.. "m" end
for _, dot in ipairs(radarDots) do dot.Visible = false end
for _, dot in ipairs(radarObjectDots) do dot.Visible = false end
local halfSize = VD.RADAR_Size / 2
local margin = 5
local usableHalf = halfSize - margin
local scale = usableHalf / VD.RADAR_Range
local cameraLook = camera.CFrame.LookVector
local playerAngle = math.atan2(-cameraLook.X, -cameraLook.Z)
local cosAngle = math.cos(playerAngle)
local sinAngle = math.sin(playerAngle)
local playerPos = root.Position
local function WorldToRadar(worldPos)
local deltaX = worldPos.X - playerPos.X
local deltaZ = worldPos.Z - playerPos.Z
local distance = math.sqrt(deltaX * deltaX + deltaZ * deltaZ)
if distance > VD.RADAR_Range then return nil end
local rotatedX = deltaX * cosAngle - deltaZ * sinAngle
local rotatedZ = deltaX * sinAngle + deltaZ * cosAngle
local radarX = rotatedX * scale
local radarY = rotatedZ * scale
local clampedX = math.clamp(radarX, -usableHalf + 4, usableHalf - 4)
local clampedY = math.clamp(radarY, -usableHalf + 4, usableHalf - 4)
return Vector2.new(halfSize + clampedX, halfSize + clampedY)
end
local dotIndex = 1
local objIndex = 1
local drawnPlayers = {}
local drawnObjects = {}
local function AddObjectDot(pos, color, size, identifier)
if not pos or drawnObjects[identifier] then return end
drawnObjects[identifier] = true
if objIndex <= #radarObjectDots then
local dot = radarObjectDots[objIndex]
dot.Size = UDim2.new(0, size, 0, size)
dot.Position = UDim2.new(0, pos.X - (size/2), 0, pos.Y - (size/2))
dot.BackgroundColor3 = color
dot.Visible = true
objIndex = objIndex + 1
end
end
-- Player dots
if VD.RADAR_ShowKiller or VD.RADAR_ShowSurvivor then
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Character then
local playerRoot = player.Character:FindFirstChild("HumanoidRootPart")
if playerRoot then
local isKiller = IsKiller(player)
local shouldShow = (isKiller and VD.RADAR_ShowKiller) or (not isKiller and VD.RADAR_ShowSurvivor)
if shouldShow and not drawnPlayers[player.UserId] then
local pos = WorldToRadar(playerRoot.Position)
if pos and dotIndex <= #radarDots then
drawnPlayers[player.UserId] = true
local dot = radarDots[dotIndex]
if isKiller then
dot.Size = UDim2.new(0, 7, 0, 7)
dot.Position = UDim2.new(0, pos.X - 3.5, 0, pos.Y - 3.5)
dot.BackgroundColor3 = GetKillerColorForRadar(player)
else
dot.Size = UDim2.new(0, 6, 0, 6)
dot.Position = UDim2.new(0, pos.X - 3, 0, pos.Y - 3)
dot.BackgroundColor3 = RADAR_COLORS.Survivor -- Oranye untuk Survivor (tim)
end
dot.Visible = true
dotIndex = dotIndex + 1
end
end
end
end
end
end
-- Generator dots
if VD.RADAR_ShowGenerator then
for _, gen in ipairs(KYS_Cache.Generators or {}) do
if gen.model and gen.model.Parent and gen.part then
local pos = WorldToRadar(gen.part.Position)
if pos then AddObjectDot(pos, RADAR_COLORS.Generator, 5, "gen_" .. tostring(gen.model)) end
end
end
end
-- Pallet dots
if VD.RADAR_ShowPallet then
for _, pallet in ipairs(KYS_Cache.Pallets or {}) do
if pallet.model and pallet.model.Parent and pallet.part then
local isBroken = false
local ok, db = pcall(function() return pallet.model:GetAttribute("Destroyed") or pallet.model:GetAttribute("Broken") or pallet.model:GetAttribute("IsBroken") end)
if ok and db then isBroken = true end
if not isBroken and not pallet.model:FindFirstChildWhichIsA("BasePart", true) then
isBroken = true
end
if not isBroken then
local pos = WorldToRadar(pallet.part.Position)
if pos then AddObjectDot(pos, RADAR_COLORS.Pallet, 4, "pallet_" .. tostring(pallet.model)) end
end
end
end
end
-- Hook dots
if VD.RADAR_ShowHook then
for _, hook in ipairs(KYS_Cache.Hooks or {}) do
if hook.model and hook.model.Parent and hook.part then
local pos = WorldToRadar(hook.part.Position)
if pos then AddObjectDot(pos, RADAR_COLORS.Hook, 5, "hook_" .. tostring(hook.model)) end
end
end
end
-- Gate dots
if VD.RADAR_ShowGate then
for _, gate in ipairs(KYS_Cache.Gates or {}) do
if gate.model and gate.model.Parent and gate.part then
local pos = WorldToRadar(gate.part.Position)
if pos then AddObjectDot(pos, RADAR_COLORS.Gate, 5, "gate_" .. tostring(gate.model)) end
end
end
end
-- Window dots
if VD.RADAR_ShowWindow then
for _, window in ipairs(KYS_Cache.Windows or {}) do
if window.model and window.model.Parent and window.part then
local pos = WorldToRadar(window.part.Position)
if pos then AddObjectDot(pos, RADAR_COLORS.Window, 4, "window_" .. tostring(window.model)) end
end
end
end
-- Zombie/SCP dots
if VD.RADAR_ShowZombie then
if KYS_WorldReg and KYS_WorldReg.SCPZombie then
for model, entry in pairs(KYS_WorldReg.SCPZombie) do
if model and model.Parent then
local refPart = model:FindFirstChild("HumanoidRootPart") or (entry and entry.part) or model.PrimaryPart or model:FindFirstChildWhichIsA("BasePart")
if refPart then
local pos = WorldToRadar(refPart.Position)
if pos then AddObjectDot(pos, RADAR_COLORS.Zombie, 5, "zombie_" .. tostring(model)) end
end
end
end
end
end
end
-- =====================================================
-- TELEPORT HELPERS
-- =====================================================
local originalCanCollide = {}
function KYS_TeleportToPosition(pos)
if not pos then return false end
local root = Root
if not root then return false end
if LocalPlayer.Character then
root.Anchored = true -- Tahan agar tidak jatuh ke luar map saat CanCollide mati
for _, part in ipairs(LocalPlayer.Character:GetDescendants()) do
if part:IsA("BasePart") then
if originalCanCollide[part] == nil then originalCanCollide[part] = part.CanCollide end
part.CanCollide = false
end
end
end
root.CFrame = CFrame.new(pos + Vector3.new(0, VD.TP_Offset, 0))
task.delay(0.3, function()
if LocalPlayer.Character then
for _, part in ipairs(LocalPlayer.Character:GetDescendants()) do
if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
pcall(function()
part.CanCollide = (originalCanCollide[part] ~= nil) and originalCanCollide[part] or true
end)
end
end
root.Anchored = false -- Lepas tahanan setelah collision aktif
end
originalCanCollide = {}
end)
return true
end
function KYS_TeleportToGenerator(index)
if not KYS_Cache or not KYS_Cache.Generators or #KYS_Cache.Generators == 0 then print("[KYS HUB] Generator tidak ditemukan") return false end
local sorted = {}
for _, gen in ipairs(KYS_Cache.Generators) do
table.insert(sorted, {gen = gen, dist = (Root and (gen.part.Position - Root.Position).Magnitude) or math.huge})
end
table.sort(sorted, function(a, b) return a.dist < b.dist end)
local target = sorted[index or 1]
if not target then return false end
return KYS_TeleportToPosition(target.gen.part.Position)
end
function KYS_TeleportToGate()
if not KYS_Cache or not KYS_Cache.Gates or #KYS_Cache.Gates == 0 then print("[KYS HUB] Gate tidak ditemukan") return false end
local closest, closestDist = nil, math.huge
for _, gate in ipairs(KYS_Cache.Gates) do
local dist = (Root and (gate.part.Position - Root.Position).Magnitude) or math.huge
if dist < closestDist then
closestDist = dist
closest = gate
end
end
if not closest then return false end
return KYS_TeleportToPosition(closest.part.Position)
end
function KYS_TeleportToHook()
if not KYS_Cache or not KYS_Cache.ClosestHook then print("[KYS HUB] Hook tidak ditemukan") return false end
return KYS_TeleportToPosition(KYS_Cache.ClosestHook.part.Position)
end
-- MAP CHANGE DETECTION
local CurrentMapName = nil
local MapWatchConnections = {}
local MapScanQueued = false
function DisconnectMapWatchers()
for _, conn in ipairs(MapWatchConnections) do
if conn then pcall(function() conn:Disconnect() end) end
end
MapWatchConnections = {}
end
function CheckMapChange()
local map = Workspace:FindFirstChild("Map")
local mapName = map and map.Name or "Unknown"
if CurrentMapName ~= mapName then
-- print("[KYS HUB] Map berubah: " .. tostring(CurrentMapName) .. " -> " .. mapName)
VD._BeatSurvivorDone = false
VD._BeatKillerDone = false
VD._LastTeleAway = 0
VD._KillerTarget = nil
end
CurrentMapName = mapName
KYS_ScanMap()
end
function QueueMapScan(delaySec)
if MapScanQueued then return end
MapScanQueued = true
task.delay(delaySec or 0.15, function()
MapScanQueued = false
if VD.Destroyed then return end
CheckMapChange()
end)
end
function WatchCurrentMap(map)
DisconnectMapWatchers()
if not map then return end
local function onDescendantAdded(descendant)
if descendant:IsA("Model") or descendant:IsA("Folder") then
local n = descendant.Name:lower()
if n:find("generator") or n:find("mesin") or n:find("pallet") or n:find("window") or n:find("hook") or n:find("gate") then
task.delay(0.5, function()
if not descendant.Parent then return end
local part = descendant:FindFirstChild("HitBox", true) or descendant:FindFirstChild("GeneratorPoint", true) or descendant.PrimaryPart or descendant:FindFirstChildWhichIsA("BasePart", true)
if part then
if n:find("generator") or n:find("mesin") then table.insert(KYS_Cache.Generators, {model=descendant, part=part})
elseif n:find("pallet") then table.insert(KYS_Cache.Pallets, {model=descendant, part=part})
elseif n:find("window") then table.insert(KYS_Cache.Windows, {model=descendant, part=part})
elseif n:find("hook") then table.insert(KYS_Cache.Hooks, {model=descendant, part=part})
elseif n:find("gate") then table.insert(KYS_Cache.Gates, {model=descendant, part=part})
end
end
end)
end
end
end
table.insert(MapWatchConnections, map.DescendantAdded:Connect(onDescendantAdded))
table.insert(MapWatchConnections, map.AncestryChanged:Connect(function(_, parent)
if not parent then QueueMapScan(0.05) end
end))
end
Workspace.ChildAdded:Connect(function(child)
if child and child.Name == "Map" then
WatchCurrentMap(child)
QueueMapScan(0.05)
end
if child and child.Name == "Spearprojectile" and VD.SURV_AutoDodgeSpear and GetRole() == "Survivor" then
task.spawn(function()
if getgenv().KYS_IsDodging then return end
local root = Root
if not root then return end
-- Biarkan projectile inisialisasi arahnya beberapa frame
task.wait(0.05)
-- Cari part fisiknya (Hitbox atau Spear1)
-- Cari part fisiknya
local mainPart = child:WaitForChild("Hitbox", 1) or child:WaitForChild("Spear1", 1) or child.PrimaryPart or child:FindFirstChildWhichIsA("BasePart")
if not mainPart then return end
-- Biarkan posisinya set set dulu oleh gamenya (1 frame)
task.wait()
local originPos = mainPart.Position
-- Berdasarkan bedah module game, Spear diputar CFrame.Angles(-math.pi/2, 0, 0)
-- Ini membuat UpVector (Y) berubah menjadi arah lintasan (LookVector/Z).
local spearDir = mainPart.CFrame.UpVector
local toPlayer = (root.Position - originPos).Unit
local dot = spearDir:Dot(toPlayer)
-- Jika dot mendekati 1, tombak mengarah sangat dekat ke kita
if dot > 0.85 then
if dot > 0.85 then -- Sudut cukup sempit, berbahaya!
getgenv().KYS_IsDodging = true
local originalCFrame = root.CFrame
-- Teleport ke samping sejauh 8 stud
local rightVector = root.CFrame.RightVector
root.CFrame = root.CFrame + (rightVector * 8)
pcall(VD_Notify, "Auto Dodge", "Spear terdeteksi! Menghindar otomatis...", 2)
-- Tunggu 1 detik lalu balik ke posisi awal
task.wait(1)
if Root then
Root.CFrame = originalCFrame
end
getgenv().KYS_IsDodging = false
end
end
end)
end
end)
Workspace.ChildRemoved:Connect(function(child)
if child and child.Name == "Map" then
DisconnectMapWatchers()
QueueMapScan(0.05)
end
end)
do
local map = Workspace:FindFirstChild("Map")
if map then WatchCurrentMap(map) end
CheckMapChange()
end
-- =====================================================
-- AUTO ATTACK (Killer)
-- =====================================================
do -- begin Auto Features scope
local function KYS_AutoAttack()
if not VD.AUTO_Attack or GetRole() ~= "Killer" then return end
local root = Root
if not root then return end
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsSurvivor(player) and player.Character then
local tRoot = player.Character:FindFirstChild("HumanoidRootPart")
local tHum = player.Character:FindFirstChildOfClass("Humanoid")
if tRoot and tHum and tHum.MaxHealth > 0 then
local pct = tHum.Health / tHum.MaxHealth
if pct > 0.25 and (tRoot.Position - root.Position).Magnitude <= VD.AUTO_AttackRange then
pcall(function()
local r = ReplicatedStorage:FindFirstChild("Remotes")
local a = r and r:FindFirstChild("Attacks")
local b = a and a:FindFirstChild("BasicAttack")
if b then b:FireServer(false) end
end)
break
end
end
end
end
end
-- =====================================================
-- AUTO VAULT (Survivor) - otomatis saat dekat Window
-- =====================================================
-- Lacak window yang sudah di-vault agar tidak loop terus
local _vaultedWindows = {} -- [rootWindow] = lastTime
local _lastVaultScan = 0
RunService.Heartbeat:Connect(function()
if VD.SURV_FastVault then
pcall(function()
local char = LocalPlayer.Character
if char then
char:SetAttribute("vaultspeed", (VD.SURV_VaultSpeed or 13) / 10)
end
end)
end
if VD.SURV_FleeKiller then
pcall(function()
local root = Root
if not root then return end
if GetRole() == "Killer" then return end
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsKiller(player) then
local killerRoot = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
if killerRoot and (killerRoot.Position - root.Position).Magnitude <= (VD.SURV_FleeDistance or 40) then
local direction = (root.Position - killerRoot.Position).Unit
root.CFrame = CFrame.new(root.Position + direction * ((VD.SURV_FleeDistance or 40) + 15), root.Position + direction * 100)
break
end
end
end
end)
end
end)
RunService.Heartbeat:Connect(function()
if not VD.SURV_AutoVault then return end
if GetRole() ~= "Survivor" then return end
if tick() - _lastVaultScan < 0.15 then return end -- cek 6-7x per detik
_lastVaultScan = tick()
pcall(function()
local char = LocalPlayer.Character
local myRoot = char and char:FindFirstChild("HumanoidRootPart")
local hum = char and char:FindFirstChildOfClass("Humanoid")
if not myRoot or not hum or hum.Health <= 0 then return end
-- Hanya vault kalau sedang bergerak (kecepatan > 1)
local vel = myRoot.AssemblyLinearVelocity
if vel.Magnitude < 1 then return end
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local winFolder = remotes and remotes:FindFirstChild("Window")
local vaultEv = winFolder and winFolder:FindFirstChild("VaultCommit")
if not vaultEv then return end
-- Kelompokkan part vault per window secara akurat
local windowGroups = {}
for _, win in ipairs(KYS_Cache.Windows or {}) do
local part = win.part or win.model
if part then
local rootWindow = part.Parent
-- Jika part adalah VaultPoint, root windownya adalah parent dari VaultTrigger
if part.Name == "VaultPoint" and part.Parent and part.Parent.Name == "VaultTrigger" then
rootWindow = part.Parent.Parent
elseif part.Name == "VaultTrigger" and part.Parent then
rootWindow = part.Parent
end
if rootWindow then
windowGroups[rootWindow] = windowGroups[rootWindow] or {}
-- Hindari duplikasi
local exists = false
for _, p in ipairs(windowGroups[rootWindow]) do
if p == part then exists = true break end
end
if not exists then
table.insert(windowGroups[rootWindow], part)
end
end
end
end
-- Untuk setiap group window, cek jika player dekat salah satu part
for rootWindow, parts in pairs(windowGroups) do
-- Kumpulkan SEMUA VaultTrigger dari rootWindow secara langsung.
-- Dikonfirmasi dari remote spy:
-- A→B pakai VaultTrigger ke-2 (GetChildren()[4])
-- B→A pakai VaultTrigger pertama (.VaultTrigger = FindFirstChild)
-- Arah ditentukan dari VaultTrigger MANA yang dikirim, bukan posisi player.
-- VaultTrigger terdekat dengan player = sisi yang sama = trigger yang benar.
local function getVTPosition(vt)
if vt:IsA("BasePart") then
return vt.Position
end
-- Jika Model, ambil dari PrimaryPart atau BasePart pertama
if vt:IsA("Model") then
if vt.PrimaryPart then return vt.PrimaryPart.Position end
local bp = vt:FindFirstChildWhichIsA("BasePart", true)
if bp then return bp.Position end
end
return nil
end
local allVTs = {}
for _, child in ipairs(rootWindow:GetChildren()) do
if child.Name == "VaultTrigger" then
table.insert(allVTs, child)
end
end
-- Jika tidak ada VaultTrigger di rootWindow, skip window ini
if #allVTs == 0 then continue end
-- Cari VaultTrigger TERDEKAT dengan player (= trigger sisi yang sama = benar)
local nearestVT, nearestVTDist = nil, math.huge
for _, vt in ipairs(allVTs) do
local pos = getVTPosition(vt)
if pos then
local d = (myRoot.Position - pos).Magnitude
if d < nearestVTDist then
nearestVTDist = d
nearestVT = vt
end
end
end
-- Player harus dalam radius 6.0 studs dari VaultTrigger terdekat
if not nearestVT or nearestVTDist > 6.0 then continue end
-- Cek cooldown per-rootWindow (3.0s)
local lastUsed = _vaultedWindows[rootWindow] or 0
if tick() - lastUsed < 3.0 then continue end
-- finalTarget = VaultTrigger terdekat (sesuai sisi player)
local finalTarget = nearestVT
local remotes2 = ReplicatedStorage:FindFirstChild("Remotes")
local winFold = remotes2 and remotes2:FindFirstChild("Window")
if winFold and finalTarget then
local vaultEvent = winFold:FindFirstChild("VaultEvent")
local vaultBindable = winFold:FindFirstChild("Vaultbindable")
local fastvault = winFold:FindFirstChild("fastvault")
local vaultComplete1 = winFold:FindFirstChild("VaultCompleteEventpart1")
local vaultComplete = winFold:FindFirstChild("VaultCompleteEvent")
-- Sesuai spy: VaultEvent(nearestVT, true) → fastvault → Complete1 → CompleteEvent(nearestVT, false)
if vaultEvent then pcall(function() vaultEvent:FireServer(finalTarget, true) end) end
if vaultBindable then pcall(function() vaultBindable:Fire(finalTarget, true) end) end
if fastvault then pcall(function() fastvault:FireServer(LocalPlayer) end) end
if vaultComplete1 then pcall(function() vaultComplete1:FireServer() end) end
if vaultComplete then pcall(function() vaultComplete:FireServer(finalTarget, false) end) end
end
_vaultedWindows[rootWindow] = tick()
break
end
end)
end)
-- =====================================================
-- AUTO PALLET DROP (Survivor) - otomatis saat killer dekat
-- =====================================================
-- Spy confirmed: PalletDropEvent:FireServer(PalletPointSlide)
-- Hanya 1 event yang perlu dikirim (bukan Commit/Anim)
-- Pallet ada di workspace.Map.Rooftop → scan scope diperluas
local _lastPalletDrop = 0
local _usedPallets = {} -- [palletwrong model] = true
local function getKillerRoot()
for _, plr in ipairs(Players:GetPlayers()) do
if plr == LocalPlayer then continue end
if IsSurvivor and IsSurvivor(plr) then continue end
local char = plr.Character
if char then
local root = char:FindFirstChild("HumanoidRootPart")
if root then return root end
end
end
return nil
end
local _lastPalletScan = 0
RunService.Heartbeat:Connect(function()
if not VD.SURV_AutoPallet then return end
if GetRole() ~= "Survivor" then return end
if tick() - _lastPalletScan < 0.2 then return end
_lastPalletScan = tick()
if tick() - _lastPalletDrop < 2.5 then return end
pcall(function()
local char = LocalPlayer.Character
local myRoot = char and char:FindFirstChild("HumanoidRootPart")
local hum = char and char:FindFirstChildOfClass("Humanoid")
if not myRoot or not hum or hum.Health <= 0 then return end
local killerRoot = getKillerRoot()
if not killerRoot then return end
if (myRoot.Position - killerRoot.Position).Magnitude > VD.SURV_AutoPalletDist then return end
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local palletFold = remotes and remotes:FindFirstChild("Pallet")
local dropEvent = palletFold and palletFold:FindFirstChild("PalletDropEvent")
if not dropEvent then return end
-- Scan pallet dari KYS_Cache + langsung dari workspace
-- Cari Palletwrong terdekat yang belum di-drop
local bestPalletwrong, bestDist = nil, 8 -- max 8 studs
-- Helper: cari PalletPointSlide di dalam Palletwrong model
local function findPalletPointSlide(model)
-- Spy: target = Palletwrong.PalletPointSlide
local slide = model:FindFirstChild("PalletPointSlide")
if slide then return slide end
-- Fallback: cari di descendants
for _, child in ipairs(model:GetDescendants()) do
if child.Name == "PalletPointSlide" then return child end
end
-- Fallback terakhir: PalletPoint
return model:FindFirstChild("PalletPoint")
end
-- Iterasi KYS_Cache.Pallets untuk cari Palletwrong terdekat
for _, pal in ipairs(KYS_Cache.Pallets or {}) do
local palModel = pal.model -- ini adalah Palletwrong model
if not palModel then continue end
if _usedPallets[palModel] then continue end
-- Gunakan PalletPoint/PalletPointSlide sebagai referensi posisi
local refPart = pal.part or palModel:FindFirstChild("PalletPoint")
or palModel:FindFirstChild("PalletPointSlide")
if not refPart then continue end
local ok, pos = pcall(function() return refPart.Position end)
if not ok or not pos then continue end
local d = (myRoot.Position - pos).Magnitude
if d < bestDist then
bestDist = d
bestPalletwrong = palModel
end
end
if bestPalletwrong then
-- Cari PalletPointSlide di dalam Palletwrong (sesuai spy)
local fireTarget = findPalletPointSlide(bestPalletwrong)
if fireTarget then
-- Spy confirmed: hanya PalletDropEvent(PalletPointSlide)
pcall(function() dropEvent:FireServer(fireTarget) end)
_usedPallets[bestPalletwrong] = true
_lastPalletDrop = tick()
end
end
end)
end)
-- =====================================================
-- HITBOX EXPAND (Killer)
-- =====================================================
local OriginalHitboxSizes = {}
local function KYS_UpdateHitboxes()
local function restoreAll()
for player, originalSize in pairs(OriginalHitboxSizes) do
if player and player.Character then
local r = player.Character:FindFirstChild("HumanoidRootPart")
if r then
r.Size = originalSize; r.Transparency = 1; r.CanCollide = true
end
end
end
OriginalHitboxSizes = {}
end
if GetRole() ~= "Killer" or not VD.HITBOX_Enabled then
restoreAll()
return
end
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsSurvivor(player) then
local char = player.Character
if char then
local root = char:FindFirstChild("HumanoidRootPart")
local hum = char:FindFirstChildOfClass("Humanoid")
if root and hum and hum.Health > 0 then
if not OriginalHitboxSizes[player] then
OriginalHitboxSizes[player] = root.Size
end
local sz = VD.HITBOX_Size
root.Size = Vector3.new(sz, sz, sz)
root.CanCollide = false
root.Transparency = 0.7
elseif root and OriginalHitboxSizes[player] then
root.Size = OriginalHitboxSizes[player]
root.Transparency = 1
root.CanCollide = true
OriginalHitboxSizes[player] = nil
end
end
end
end
end
-- =====================================================
-- DESTROY ALL PALLETS (Killer)
-- =====================================================
local IsBreakingPallet = false
local function KYS_DestroyAllPallets()
if not VD.KILLER_DestroyPallets or GetRole() ~= "Killer" then return end
if IsBreakingPallet then return end
local char = LocalPlayer.Character
local root = Root
if not char or not root then return end
-- Check character attributes to prevent breaking while stunned, carrying, etc.
local stunned = char:GetAttribute("IsStunned") or char:GetAttribute("isStunned")
local immobile = char:GetAttribute("Immobile") or char:GetAttribute("immobile")
local carrying = char:GetAttribute("IsCarrying") or char:GetAttribute("isCarrying")
local pursuit = char:GetAttribute("Pursuit") or char:GetAttribute("pursuit")
local ci = char:FindFirstChild("CheckInterractable")
local action = ci and (ci:GetAttribute("action") or ci:GetAttribute("Action"))
if stunned or immobile or carrying or pursuit or action then return end
-- Find nearby pallet using the PalletPointSlide tag
local CollectionService = game:GetService("CollectionService")
local pts = CollectionService:GetTagged("PalletPointSlide")
local nearest, minDist = nil, 6 -- 6 studs range
for _, p in ipairs(pts) do
if p:IsA("BasePart") and not CollectionService:HasTag(p, "doing action") then
local d = (p.Position - root.Position).Magnitude
if d < minDist then
minDist = d
nearest = p
end
end
end
if nearest then
IsBreakingPallet = true
task.spawn(function()
pcall(function()
local r = ReplicatedStorage:FindFirstChild("Remotes")
local p = r and r:FindFirstChild("Pallet")
local j = p and p:FindFirstChild("Jason")
if j then
local dg = j:FindFirstChild("Destroy-Global")
local commit = j:FindFirstChild("PalletBreakCommit")
if dg and dg:IsA("RemoteEvent") then
dg:FireServer(nearest)
end
if commit and commit:IsA("RemoteEvent") then
commit:FireServer(nearest)
end
end
end)
-- Wait for breaking animation to finish (based on Immobile attribute)
task.wait(0.2)
local startTime = os.clock()
while char and char.Parent and (char:GetAttribute("Immobile") or char:GetAttribute("immobile")) do
if os.clock() - startTime > 3 then break end -- timeout safety
task.wait(0.1)
end
IsBreakingPallet = false
end)
end
end
-- =====================================================
-- AUTO KICK GENERATOR (Killer)
-- =====================================================
getgenv().KYS_IsBreakingGenerator = false
function KYS_AutoBreakGene()
if not VD.KILLER_AutoBreakGene or GetRole() ~= "Killer" then return end
if getgenv().KYS_IsBreakingGenerator then return end
local char = LocalPlayer.Character
local root = Root
if not char or not root then return end
-- Check character attributes to prevent breaking while stunned, carrying, etc.
local stunned = char:GetAttribute("IsStunned") or char:GetAttribute("isStunned")
local immobile = char:GetAttribute("Immobile") or char:GetAttribute("immobile")
local carrying = char:GetAttribute("IsCarrying") or char:GetAttribute("isCarrying")
local pursuit = char:GetAttribute("Pursuit") or char:GetAttribute("pursuit")
local ci = char:FindFirstChild("CheckInterractable")
local action = ci and (ci:GetAttribute("action") or ci:GetAttribute("Action"))
if stunned or immobile or carrying or pursuit or action then return end
-- Find nearby generator using the GeneratorPoint tag
local CollectionService = game:GetService("CollectionService")
local pts = CollectionService:GetTagged("GeneratorPoint")
local nearest, minDist = nil, 6 -- 6 studs range
for _, p in ipairs(pts) do
if p:IsA("BasePart") and not CollectionService:HasTag(p, "doing action") then
-- Check if generator can be kicked (progress > 0, progress < 100, kickcount <= 7)
local genModel = p.Parent
if genModel then
local progress = genModel:GetAttribute("RepairProgress") or genModel:GetAttribute("repairProgress") or 0
local kickcount = genModel:GetAttribute("kickcount") or genModel:GetAttribute("KickCount") or 0
if progress > 0 and progress < 100 and kickcount <= 7 then
local d = (p.Position - root.Position).Magnitude
if d < minDist then
minDist = d
nearest = p
end
end
end
end
end
if nearest then
getgenv().KYS_IsBreakingGenerator = true
task.spawn(function()
pcall(function()
local r = ReplicatedStorage:FindFirstChild("Remotes")
local g = r and r:FindFirstChild("Generator")
if g then
local event = g:FindFirstChild("BreakGenEvent")
local commit = g:FindFirstChild("BreakGenCommit")
if event and event:IsA("RemoteEvent") then
event:FireServer(nearest)
end
if commit and commit:IsA("RemoteEvent") then
commit:FireServer(nearest)
end
end
end)
-- Wait for breaking animation to finish (based on Immobile attribute)
task.wait(0.2)
local startTime = os.clock()
while char and char.Parent and (char:GetAttribute("Immobile") or char:GetAttribute("immobile")) do
if os.clock() - startTime > 3 then break end -- timeout safety
task.wait(0.1)
end
task.wait(0.3)
getgenv().KYS_IsBreakingGenerator = false
end)
end
end
-- =====================================================
-- BLOCK ALL VAULTS (Killer)
-- =====================================================
getgenv().KYS_LastVaultBlockTime = 0
function KYS_BlockAllVaults()
if not VD.KILLER_BlockVaults or GetRole() ~= "Killer" then return end
local now = tick()
if now - getgenv().KYS_LastVaultBlockTime < 1.5 then return end
getgenv().KYS_LastVaultBlockTime = now
pcall(function()
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local vaultEvent = remotes and remotes:FindFirstChild("Window") and remotes.Window:FindFirstChild("VaultEvent")
if not vaultEvent then return end
local map = workspace:FindFirstChild("Map")
local vaultsFolder = map and map:FindFirstChild("Vaults")
if vaultsFolder then
for _, vault in ipairs(vaultsFolder:GetChildren()) do
for _, part in ipairs(vault:GetChildren()) do
if part:IsA("BasePart") then
pcall(function() vaultEvent:FireServer(part, true) end)
end
end
end
else
-- Fallback using KYS_Cache.Windows if Map structure is not default
for _, win in ipairs(KYS_Cache.Windows or {}) do
local window = win.model
if window and window.Parent then
for _, child in ipairs(window:GetDescendants()) do
if child:IsA("BasePart") then
pcall(function() vaultEvent:FireServer(child, true) end)
end
end
end
end
end
end)
end
-- =====================================================
-- AUTO DROP ALL PALLETS (Killer)
-- =====================================================
getgenv().KYS_LastPalletBlockTime = 0
function KYS_BlockAllPalletDrops()
if not VD.KILLER_BlockPallets or GetRole() ~= "Killer" then return end
local now = tick()
if now - getgenv().KYS_LastPalletBlockTime < 2 then return end
getgenv().KYS_LastPalletBlockTime = now
pcall(function()
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local palletFold = remotes and remotes:FindFirstChild("Pallet")
local dropEvent = palletFold and palletFold:FindFirstChild("PalletDropEvent")
if not dropEvent then return end
local map = workspace:FindFirstChild("Map")
if not map then return end
-- Scan semua Palletwrong di Map
for _, obj in ipairs(map:GetDescendants()) do
if obj.Name == "Palletwrong" and (obj:IsA("Model") or obj:IsA("Folder")) then
local target = obj:FindFirstChild("PalletPointSlide") or obj:FindFirstChild("PalletPoint")
if target then
pcall(function() dropEvent:FireServer(target) end)
end
end
end
-- Fallback: gunakan KYS_Cache.Pallets
for _, pal in ipairs(KYS_Cache.Pallets or {}) do
local palModel = pal.model
if palModel and palModel.Parent then
local target = palModel:FindFirstChild("PalletPointSlide") or palModel:FindFirstChild("PalletPoint") or pal.part
if target then
pcall(function() dropEvent:FireServer(target) end)
end
end
end
end)
end
-- =====================================================
-- BLOCK PALLET DROP (Killer) - Drop + TP Break semua pallet
-- =====================================================
getgenv().KYS_LastPalletBlockDropTime = 0
getgenv().KYS_IsBlockingPallets = false
-- Helper: force bersihkan semua attribute yang bisa bikin stuck
local function KYS_ForceUnstuck(char)
pcall(function()
char:SetAttribute("Immobile", nil)
char:SetAttribute("immobile", nil)
char:SetAttribute("IsStunned", nil)
char:SetAttribute("isStunned", nil)
char:SetAttribute("Pursuit", nil)
char:SetAttribute("pursuit", nil)
end)
-- Pastikan WalkSpeed tidak nol
pcall(function()
local hum = char:FindFirstChildOfClass("Humanoid")
if hum and hum.WalkSpeed <= 0 then
hum.WalkSpeed = 16
end
end)
end
function KYS_BlockPalletDrop()
if not VD.KILLER_BlockPalletDrop or GetRole() ~= "Killer" then return end
if getgenv().KYS_IsBlockingPallets then return end
local now = tick()
if now - getgenv().KYS_LastPalletBlockDropTime < 4 then return end
getgenv().KYS_LastPalletBlockDropTime = now
local char = LocalPlayer.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
if not root then return end
-- Skip jika sedang stunned/carrying
local stunned = char:GetAttribute("IsStunned") or char:GetAttribute("isStunned")
local immobile = char:GetAttribute("Immobile") or char:GetAttribute("immobile")
local carrying = char:GetAttribute("IsCarrying") or char:GetAttribute("isCarrying")
if stunned or immobile or carrying then return end
pcall(function()
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local palletFold = remotes and remotes:FindFirstChild("Pallet")
local dropEvent = palletFold and palletFold:FindFirstChild("PalletDropEvent")
local jasonFold = palletFold and palletFold:FindFirstChild("Jason")
local destroyGlobal = jasonFold and jasonFold:FindFirstChild("Destroy-Global")
local breakCommit = jasonFold and jasonFold:FindFirstChild("PalletBreakCommit")
local destroySingle = jasonFold and jasonFold:FindFirstChild("Destroy")
if not dropEvent or not destroyGlobal or not breakCommit then return end
local map = workspace:FindFirstChild("Map")
if not map then return end
-- Helper: kumpulkan semua target pallet yang masih ada
local function collectTargets()
local targets = {}
local seen = {}
for _, obj in ipairs(map:GetDescendants()) do
if obj.Name == "Palletwrong" and (obj:IsA("Model") or obj:IsA("Folder")) then
local target = obj:FindFirstChild("PalletPointSlide") or obj:FindFirstChild("PalletPoint")
if target and target:IsA("BasePart") and not seen[target] then
table.insert(targets, target)
seen[target] = true
end
end
end
for _, pal in ipairs(KYS_Cache.Pallets or {}) do
local palModel = pal.model
if palModel and palModel.Parent then
local target = palModel:FindFirstChild("PalletPointSlide") or palModel:FindFirstChild("PalletPoint") or pal.part
if target and target:IsA("BasePart") and not seen[target] then
table.insert(targets, target)
seen[target] = true
end
end
end
return targets
end
local targets = collectTargets()
if #targets == 0 then return end
getgenv().KYS_IsBlockingPallets = true
-- Simpan WalkSpeed awal
local hum = char:FindFirstChildOfClass("Humanoid")
local origWalkSpeed = hum and hum.WalkSpeed or 16
task.spawn(function()
pcall(function()
local originalCF = root.CFrame
-- Helper: proses satu pallet (drop → teleport → break)
local function processPallet(target)
if not target or not target.Parent then return end
pcall(function()
-- Drop pallet dulu
dropEvent:FireServer(target)
task.wait(0.12)
-- Teleport ke pallet
root.CFrame = target.CFrame + Vector3.new(0, 2, 0)
task.wait(0.15)
-- Hancurkan pallet - kirim semua remote
destroyGlobal:FireServer(target)
breakCommit:FireServer(target)
if destroySingle then
destroySingle:FireServer(target)
end
task.wait(0.12)
-- Force unstuck
KYS_ForceUnstuck(char)
end)
end
-- Pass 1: proses semua pallet
for _, target in ipairs(targets) do
processPallet(target)
end
-- Teleport balik dulu
task.wait(0.1)
pcall(function() root.CFrame = originalCF end)
KYS_ForceUnstuck(char)
-- Pass 2: cek pallet yang masih tersisa, proses lagi
task.wait(0.5)
local remaining = collectTargets()
if #remaining > 0 then
originalCF = root.CFrame
for _, target in ipairs(remaining) do
processPallet(target)
end
task.wait(0.1)
pcall(function() root.CFrame = originalCF end)
end
-- Final unstuck + restore
task.wait(0.1)
KYS_ForceUnstuck(char)
if hum then
pcall(function() hum.WalkSpeed = origWalkSpeed end)
end
end)
-- Safety net: loop unstuck selama 1 detik
task.spawn(function()
for i = 1, 10 do
task.wait(0.1)
if char and char.Parent then
KYS_ForceUnstuck(char)
if hum and hum.WalkSpeed <= 0 then
pcall(function() hum.WalkSpeed = origWalkSpeed end)
end
end
end
end)
getgenv().KYS_IsBlockingPallets = false
end)
end)
end
-- =====================================================
-- BYPASS COOLDOWN (Abyss) (Killer)
-- =====================================================
getgenv().KYS_AbyssCooldownBypassConnection = nil
getgenv().KYS_CorruptHandlerFunc = nil
function KYS_StartAbyssCooldownBypass()
if not getgenv().KYS_CorruptHandlerFunc then
for _, v in pairs(getgc(true)) do
if type(v) == "function" and islclosure(v) then
local constants = debug.getconstants(v)
if table.find(constants, "corrupt") and table.find(constants, "Immobile") then
getgenv().KYS_CorruptHandlerFunc = v
break
end
end
end
end
if not getgenv().KYS_CorruptHandlerFunc then
return
end
if getgenv().KYS_AbyssCooldownBypassConnection then
getgenv().KYS_AbyssCooldownBypassConnection:Disconnect()
end
getgenv().KYS_AbyssCooldownBypassConnection = RunService.Heartbeat:Connect(function()
if not VD.KILLER_BypassCooldown then return end
if getgenv().KYS_CorruptHandlerFunc then
local upvalues = debug.getupvalues(getgenv().KYS_CorruptHandlerFunc)
for idx, val in pairs(upvalues) do
if type(val) == "boolean" then
if val == false then
debug.setupvalue(getgenv().KYS_CorruptHandlerFunc, idx, true)
end
end
end
end
end)
end
function KYS_StopAbyssCooldownBypass()
if getgenv().KYS_AbyssCooldownBypassConnection then
getgenv().KYS_AbyssCooldownBypassConnection:Disconnect()
getgenv().KYS_AbyssCooldownBypassConnection = nil
end
end
-- =====================================================
-- BYPASS COOLDOWN (Jeff / The Killer)
-- =====================================================
getgenv().KYS_JeffCooldownBypassThread = nil
function KYS_StartJeffCooldownBypass()
if getgenv().KYS_JeffCooldownBypassThread then return end
getgenv().KYS_JeffCooldownBypassThread = task.spawn(function()
local rs = game:GetService("RunService")
local player = game:GetService("Players").LocalPlayer
while task.wait() do
if not VD.KILLER_InfFrenzy then
break
end
pcall(function()
local char = player.Character
if char and char:GetAttribute("Frenzy") ~= true then
char:SetAttribute("Frenzy", true)
end
end)
end
getgenv().KYS_JeffCooldownBypassThread = nil
end)
end
function KYS_StopJeffCooldownBypass()
pcall(function()
local player = game:GetService("Players").LocalPlayer
local char = player.Character
if char and char:GetAttribute("Frenzy") == true then
char:SetAttribute("Frenzy", false)
-- Tell server we are deactivating so the real cooldown can start
local killer = game:GetService("ReplicatedStorage"):FindFirstChild("Remotes"):FindFirstChild("Killers"):FindFirstChild("Killer")
if killer then
local deact = killer:FindFirstChild("Deactivatefromclient")
if deact then
deact:FireServer()
end
end
end
end)
end
getgenv().KYS_SlasherCooldownBypassThread = nil
function KYS_StartSlasherCooldownBypass()
if getgenv().KYS_SlasherCooldownBypassThread then return end
-- BOOLEAN ARITHMETIC FAILSAFE FOR AWARDLOG
pcall(function()
local b = true
local mt = debug.getmetatable(b)
if not mt then
mt = {}
debug.setmetatable(b, mt)
end
if setreadonly then setreadonly(mt, false) end
mt.__div = function() return 0 end
mt.__mul = function() return 0 end
mt.__add = function() return 0 end
mt.__sub = function() return 0 end
if setreadonly then setreadonly(mt, true) end
end)
getgenv().KYS_SlasherCooldownBypassThread = task.spawn(function()
local toggleFunc = nil
local pursuitHandler = nil
local function scanGCForSlasher()
pcall(function()
for _, v in pairs(getgc(true)) do
if type(v) == "function" and islclosure(v) then
local consts = debug.getconstants(v)
local hasOffset, hasLinear, hasAction, hasTweenInfo = false, false, false, false
local hasPursuit, hasWalkSpeed = false, false
for _, c in pairs(consts) do
if c == "Offset" then hasOffset = true end
if c == "Linear" then hasLinear = true end
if c == "action" then hasAction = true end
if c == "TweenInfo" then hasTweenInfo = true end
if c == "Pursuit" then hasPursuit = true end
if c == "WalkSpeed" then hasWalkSpeed = true end
end
if hasOffset and hasLinear and hasAction and hasTweenInfo and not hasPursuit then
toggleFunc = v
end
if hasPursuit and hasTweenInfo and hasAction and hasWalkSpeed then
pursuitHandler = v
end
end
if toggleFunc and pursuitHandler then break end
end
end)
end
scanGCForSlasher()
local lastScan = os.clock()
local wasLakeMistActive = false
local wasPursuitActive = false
while task.wait(0.1) do
if not VD.KILLER_InfLakeMist and not VD.KILLER_InfPursuit then
break
end
if not (toggleFunc and pursuitHandler) then
if os.clock() - lastScan >= 2 then
scanGCForSlasher()
lastScan = os.clock()
end
end
if toggleFunc and VD.KILLER_InfLakeMist then
pcall(function()
debug.setupvalue(toggleFunc, 6, false) -- v_u_13 (LakeMist cooldown)
debug.setupvalue(toggleFunc, 10, false) -- v_u_12 (Anti-spam)
end)
end
if pursuitHandler and VD.KILLER_InfPursuit then
pcall(function()
debug.setupvalue(pursuitHandler, 5, false) -- v_u_12 (Anti-spam)
debug.setupvalue(pursuitHandler, 6, false) -- v_u_14 (Pursuit cooldown)
end)
end
end
getgenv().KYS_SlasherCooldownBypassThread = nil
end)
end
function KYS_StopSlasherCooldownBypass()
-- Loop will exit automatically when both VD.KILLER_InfLakeMist and VD.KILLER_InfPursuit are false
pcall(function()
local rs = game:GetService("ReplicatedStorage")
local jason = rs:FindFirstChild("Remotes") and rs.Remotes:FindFirstChild("Killers") and rs.Remotes.Killers:FindFirstChild("Jason")
if jason then
if not VD.KILLER_InfLakeMist then
local lm = jason:FindFirstChild("LakeMist")
if lm then lm:FireServer(false) end
end
if not VD.KILLER_InfPursuit then
local ps = jason:FindFirstChild("Pursuit")
if ps then ps:FireServer(false) end
end
end
end)
end
-- ==============================================
-- KILLER FAKE ATTACK (COUNTER AUTO PARRY)
-- ==============================================
getgenv().KYS_FakeAttackThread = nil
function KYS_ToggleFakeAttack(enabled)
if not enabled then
if getgenv().KYS_FakeAttackThread then
task.cancel(getgenv().KYS_FakeAttackThread)
getgenv().KYS_FakeAttackThread = nil
end
return
end
if getgenv().KYS_FakeAttackThread then return end
getgenv().KYS_FakeAttackThread = task.spawn(function()
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
while VD.KILLER_FakeAttack do
local char = LocalPlayer.Character
if char then
local Animator = char:FindFirstChild("Humanoid") and char.Humanoid:FindFirstChild("Animator")
if Animator then
local myRoot = char:FindFirstChild("HumanoidRootPart")
local near = false
if myRoot then
for _, p in ipairs(Players:GetPlayers()) do
if p ~= LocalPlayer and p.Team and p.Team.Name == "Survivors" then
local r = p.Character and p.Character:FindFirstChild("HumanoidRootPart")
if r and (myRoot.Position - r.Position).Magnitude <= 15 then
near = true
break
end
end
end
end
if near then
pcall(function()
local bait = Instance.new("Animation")
bait.AnimationId = "rbxassetid://117042998468241"
local track = Animator:LoadAnimation(bait)
track:Play()
track:AdjustWeight(0) -- event AnimationPlayed terpancar, killer tetap diam
task.wait(0.05)
track:Stop()
end)
end
end
end
task.wait(0.3)
end
getgenv().KYS_FakeAttackThread = nil
end)
end
getgenv().KYS_CureFlaskLaserThread = nil
getgenv().KYS_CureFlaskLaserPart = nil
function KYS_UpdateCureFlaskLaser()
local char = game:GetService("Players").LocalPlayer.Character
if not char then return end
local targetPos = nil
local originPos = nil
local closest = nil
local minDst = math.huge
local hrp = char:FindFirstChild("HumanoidRootPart")
if hrp then
local hand = char:FindFirstChild("LeftHand") or char:FindFirstChild("Left Arm")
originPos = hand and hand.Position or hrp.Position
for _, v in pairs(game:GetService("Players"):GetPlayers()) do
if v ~= game:GetService("Players").LocalPlayer and v.Character and v.Character:FindFirstChild("HumanoidRootPart") then
if not v.Character:GetAttribute("IsKiller") then
local dst = (v.Character.HumanoidRootPart.Position - hrp.Position).Magnitude
if dst < minDst then
minDst = dst
closest = v
end
end
end
end
end
if closest then
targetPos = closest.Character.HumanoidRootPart.Position
end
-- Check if we have action attribute true (which means charging/holding flask)
local actionActive = false
for _, child in pairs(char:GetChildren()) do
if child:IsA("LocalScript") and child:GetAttribute("action") == true then
actionActive = true
break
end
end
if originPos and targetPos and actionActive then
if not getgenv().KYS_CureFlaskLaserPart then
local laser = Instance.new("Part")
laser.Name = "FlaskSilentAimLaser"
laser.Anchored = true
laser.CanCollide = false
laser.CanTouch = false
laser.CastShadow = false
laser.Material = Enum.Material.Neon
laser.Color = Color3.fromRGB(0, 100, 255)
laser.Transparency = 0
laser.Parent = workspace
getgenv().KYS_CureFlaskLaserPart = laser
end
local dist = (targetPos - originPos).Magnitude
if dist > 0.1 then
local laser = getgenv().KYS_CureFlaskLaserPart
laser.Size = Vector3.new(0.16, 0.16, dist)
laser.CFrame = CFrame.new((originPos + targetPos) / 2, targetPos)
laser.Transparency = 0
end
else
if getgenv().KYS_CureFlaskLaserPart then
getgenv().KYS_CureFlaskLaserPart.Transparency = 1
end
end
end
function KYS_StartCureFlaskLaser()
if getgenv().KYS_CureFlaskLaserThread then return end
getgenv().KYS_CureFlaskLaserThread = game:GetService("RunService").RenderStepped:Connect(function()
if not VD.KILLER_FlaskLaser then
if getgenv().KYS_CureFlaskLaserPart then
pcall(function() getgenv().KYS_CureFlaskLaserPart:Destroy() end)
getgenv().KYS_CureFlaskLaserPart = nil
end
if getgenv().KYS_CureFlaskLaserThread then
getgenv().KYS_CureFlaskLaserThread:Disconnect()
getgenv().KYS_CureFlaskLaserThread = nil
end
return
end
pcall(KYS_UpdateCureFlaskLaser)
end)
end
-- =====================================================
-- BYPASS COOLDOWN (Hidden)
-- =====================================================
getgenv().KYS_HiddenLeapBypassThread = nil
function KYS_StartHiddenCooldownBypass()
if getgenv().KYS_HiddenLeapBypassThread then return end
getgenv().KYS_HiddenLeapBypassThread = task.spawn(function()
local leapFunction, m2Function, toggleFunc, pursuitFunc
local function scanGC()
pcall(function()
for _, v in pairs(getgc(true)) do
if type(v) == "function" and islclosure(v) then
local info
pcall(function() info = debug.getinfo(v) end)
if info then
if info.name == "tryActivate" then
leapFunction = v
elseif info.name == "playM2Animation" then
m2Function = v
end
end
end
if leapFunction and m2Function then break end
end
end)
end
scanGC()
local lastScan = os.clock()
while task.wait(0.1) do
if not VD.KILLER_BypassLeap then
break
end
-- If functions are not found, retry scanning every 2 seconds
if not (leapFunction and m2Function) then
local now = os.clock()
if now - lastScan >= 2 then
lastScan = now
scanGC()
end
end
-- Bypass cooldown by setting boolean upvalues from true to false
if leapFunction then
pcall(function()
for i, val in pairs(debug.getupvalues(leapFunction)) do
if type(val) == "boolean" and val == true then
debug.setupvalue(leapFunction, i, false)
end
end
end)
end
if m2Function then
pcall(function()
for i, val in pairs(debug.getupvalues(m2Function)) do
if type(val) == "boolean" and val == true then
debug.setupvalue(m2Function, i, false)
end
end
end)
end
end
getgenv().KYS_HiddenLeapBypassThread = nil
end)
end
function KYS_StopHiddenCooldownBypass()
-- Loop terminates automatically when VD.KILLER_BypassLeap is false
end
-- =====================================================
-- FLING
-- =====================================================
function KYS_FlingNearest()
if not VD.FLING_Enabled then return end
local root = Root
if not root then return end
local closest, closestDist = nil, math.huge
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Character then
local tr = player.Character:FindFirstChild("HumanoidRootPart")
if tr then
local dist = (tr.Position - root.Position).Magnitude
if dist < closestDist then
closestDist = dist; closest = player
end
end
end
end
if closest and closest.Character then
local tr = closest.Character:FindFirstChild("HumanoidRootPart")
if tr then
local originalPos = root.CFrame
for _ = 1, 10 do
root.CFrame = tr.CFrame
root.Velocity = Vector3.new(VD.FLING_Strength, VD.FLING_Strength / 2, VD.FLING_Strength)
root.RotVelocity = Vector3.new(9999, 9999, 9999)
task.wait()
end
root.CFrame = originalPos
root.Velocity = Vector3.zero
root.RotVelocity = Vector3.zero
end
end
end
function KYS_FlingAll()
if not VD.FLING_Enabled then return end
local root = Root
if not root then return end
local originalPos = root.CFrame
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Character then
local tr = player.Character:FindFirstChild("HumanoidRootPart")
if tr then
for _ = 1, 5 do
root.CFrame = tr.CFrame
root.Velocity = Vector3.new(VD.FLING_Strength, VD.FLING_Strength / 2, VD.FLING_Strength)
root.RotVelocity = Vector3.new(9999, 9999, 9999)
task.wait()
end
end
end
end
root.CFrame = originalPos
root.Velocity = Vector3.zero
root.RotVelocity = Vector3.zero
end
-- =====================================================
-- BEAT GAME SURVIVOR (teleport to exit)
-- =====================================================
local function KYS_BeatGameSurvivor()
if not VD.BEAT_Survivor or GetRole() ~= "Survivor" then return end
local root = Root
if not root then return end
local map = Workspace:FindFirstChild("Map")
local exitPos = nil
local finishPart = nil
-- Cara 1: Scan finishline dari seluruh workspace descendants (Seperti di fallens.lua)
pcall(function()
for _, obj in ipairs(workspace:GetDescendants()) do
local nameLower = string.lower(obj.Name)
if (nameLower == "fininshline" or nameLower == "finishline") and obj:IsA("BasePart") then
finishPart = obj
exitPos = obj.Position
break
end
end
end)
-- Cara 2: Fallback ke pengecekan spesifik map
if not exitPos and map then
pcall(function()
if map:FindFirstChild("RooftopHitbox") or map:FindFirstChild("Rooftop") then
finishPart = map:FindFirstChild("RooftopHitbox") or map:FindFirstChild("Rooftop")
if finishPart:IsA("Model") then finishPart = finishPart.PrimaryPart or finishPart:FindFirstChildWhichIsA("BasePart") end
if finishPart then exitPos = finishPart.Position else exitPos = Vector3.new(3098.16, 454.04, -4918.74) end
return
end
if map:FindFirstChild("HooksMeat") then
finishPart = map:FindFirstChild("HooksMeat")
if finishPart:IsA("Model") then finishPart = finishPart.PrimaryPart or finishPart:FindFirstChildWhichIsA("BasePart") end
if finishPart then exitPos = finishPart.Position else exitPos = Vector3.new(1546.12, 152.21, -796.72) end
return
end
if KYS_Cache and KYS_Cache.ExitPos then
exitPos = KYS_Cache.ExitPos
finishPart = KYS_Cache.ExitPart
return
end
end)
end
if not exitPos then return end
VD._LastFinishPos = VD._LastFinishPos or nil
VD._BeatSurvivorDone = VD._BeatSurvivorDone or false
if VD._BeatSurvivorDone then return end
VD._BeatSurvivorDone = true
VD._LastFinishPos = exitPos
task.spawn(function()
task.delay(4, function()
if VD._BeatSurvivorDone then VD._BeatSurvivorDone = false end
end)
for i = 1, 10 do
if not Root or not Root.Parent then break end
pcall(function()
local event = game:GetService("ReplicatedStorage"):FindFirstChild("Remotes"):FindFirstChild("Game"):FindFirstChild("PlayerActionEvent")
if event then
if event:IsA("RemoteEvent") then
event:FireServer("ESCAPED", 200)
elseif event:IsA("BindableEvent") then
event:Fire("ESCAPED", 200)
end
end
end)
if firetouchinterest and finishPart then
pcall(function() firetouchinterest(Root, finishPart, 0) end)
pcall(function() firetouchinterest(Root, finishPart, 1) end)
end
if i == 1 then
Root.Velocity = Vector3.zero
if exitPos then
Root.CFrame = CFrame.new(exitPos + Vector3.new(0, 3, 0))
end
end
pcall(function()
local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
if hum then
hum:MoveTo(exitPos) --
end
end)
task.wait(0.2)
end
end)
end
-- =====================================================
-- BEAT GAME KILLER (auto chase & attack survivors)
-- =====================================================
local function KYS_BeatGameKiller()
if not VD.BEAT_Killer then
VD._KillerTarget = nil; return
end
if GetRole() ~= "Killer" then
VD._KillerTarget = nil; return
end
local root = Root
if not root then return end
local target = VD._KillerTarget
local needNewTarget = true
if target and target.Character then
local tr = target.Character:FindFirstChild("HumanoidRootPart")
local th = target.Character:FindFirstChildOfClass("Humanoid")
if tr and th and th.MaxHealth > 0 and (th.Health / th.MaxHealth) > 0.25 then
needNewTarget = false
else
VD._KillerTarget = nil
end
end
if needNewTarget then
local survivors = {}
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsSurvivor(player) and player.Character then
local pr = player.Character:FindFirstChild("HumanoidRootPart")
local ph = player.Character:FindFirstChildOfClass("Humanoid")
if pr and ph and ph.MaxHealth > 0 and (ph.Health / ph.MaxHealth) > 0.25 then table.insert(survivors, player) end
end
end
if #survivors > 0 then
local closest, closestDist = nil, math.huge
for _, player in ipairs(survivors) do
local pr = player.Character:FindFirstChild("HumanoidRootPart")
local dist = (pr.Position - root.Position).Magnitude
if dist < closestDist then
closestDist = dist; closest = player
end
end
VD._KillerTarget = closest
target = closest
else
VD._KillerTarget = nil; return
end
end
if not target or not target.Character then return end
local tr = target.Character:FindFirstChild("HumanoidRootPart")
local th = target.Character:FindFirstChildOfClass("Humanoid")
if not tr or not th then
VD._KillerTarget = nil; return
end
if th.MaxHealth <= 0 or (th.Health / th.MaxHealth) <= 0.25 then
VD._KillerTarget = nil; return
end
for _, part in ipairs(LocalPlayer.Character:GetDescendants()) do
if part:IsA("BasePart") then pcall(function() part.CanCollide = false end) end
end
local dir = (root.Position - tr.Position).Unit
if dir.Magnitude ~= dir.Magnitude then dir = Vector3.new(1, 0, 0) end
root.CFrame = CFrame.new(tr.Position + dir * 3 + Vector3.new(0, 1, 0), tr.Position)
pcall(function()
local r = ReplicatedStorage:FindFirstChild("Remotes")
local a = r and r:FindFirstChild("Attacks")
local ba = a and a:FindFirstChild("BasicAttack")
if ba then ba:FireServer(false) end
end)
end
-- =====================================================
-- AUTO HOOK (Killer)
-- =====================================================
local IsAutoHooking = false
local function KYS_AutoHook()
if not VD.KILLER_AutoHook or GetRole() ~= "Killer" then return end
if IsAutoHooking then return end
local root = Root
if not root then return end
-- Check if we are already carrying a survivor
local char = LocalPlayer.Character
local isCarrying = false
if char then
isCarrying = char:GetAttribute("IsCarrying") or char:GetAttribute("isCarrying")
end
-- If we are already carrying, we bypass pickup and look straight for a hook
if isCarrying then
-- Find occupied hooks
local occupiedPositions = {}
for _, v in ipairs(Players:GetPlayers()) do
if v ~= LocalPlayer and v.Character then
local isHooked = v.Character:GetAttribute("IsHooked") or v.Character:GetAttribute("isHooked")
local hrp = v.Character:FindFirstChild("HumanoidRootPart")
if isHooked and hrp then
table.insert(occupiedPositions, hrp.Position)
end
end
end
-- Find nearest empty hook to our current position
local closestHook, hDist = nil, math.huge
for _, h in ipairs(KYS_Cache.Hooks or {}) do
if h.part then
local isOccupied = false
for _, occPos in ipairs(occupiedPositions) do
if (h.part.Position - occPos).Magnitude < 10 then
isOccupied = true
break
end
end
if not isOccupied then
local hd = (h.part.Position - root.Position).Magnitude
if hd < hDist then
hDist = hd; closestHook = h
end
end
end
end
if closestHook then
IsAutoHooking = true
task.spawn(function()
-- Teleport to Hook
root.CFrame = CFrame.new(closestHook.part.Position + Vector3.new(0, 3, 0))
task.wait(0.4)
-- Fire Hook Event and Hook Commit
pcall(function()
local carryFolder = ReplicatedStorage:FindFirstChild("Remotes"):FindFirstChild("Carry")
local event = carryFolder and carryFolder:FindFirstChild("HookEvent")
local commit = carryFolder and carryFolder:FindFirstChild("HookCommit")
local hookPoint = nil
if closestHook.model then
hookPoint = closestHook.model:FindFirstChild("HookPoint") or closestHook.model:FindFirstChild("HookHitbox")
end
if not hookPoint then hookPoint = closestHook.part end
if event and event:IsA("RemoteEvent") then
event:FireServer(hookPoint)
end
if commit and commit:IsA("RemoteEvent") then
commit:FireServer(hookPoint)
end
end)
task.wait(0.5)
IsAutoHooking = false
end)
end
return
end
-- If not carrying, find the closest downed survivor
local closestDowned, closestDist = nil, math.huge
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsSurvivor(player) and player.Character then
local tr = player.Character:FindFirstChild("HumanoidRootPart")
local hum = player.Character:FindFirstChildOfClass("Humanoid")
if tr and hum then
local pct = (hum.MaxHealth > 0) and (hum.Health / hum.MaxHealth) or 0
if pct <= 0.25 and pct > 0 then
local isHooked = false
if KYS_Cache and KYS_Cache.Hooks then
for _, hh in ipairs(KYS_Cache.Hooks) do
if hh.part and (hh.part.Position - tr.Position).Magnitude < 4.5 then
isHooked = true; break
end
end
end
if not isHooked then
local dist = (tr.Position - root.Position).Magnitude
if dist < closestDist then
closestDist = dist; closestDowned = tr
end
end
end
end
end
end
if closestDowned then
-- Find occupied hooks
local occupiedPositions = {}
for _, v in ipairs(Players:GetPlayers()) do
if v ~= LocalPlayer and v.Character then
local isHooked = v.Character:GetAttribute("IsHooked") or v.Character:GetAttribute("isHooked")
local hrp = v.Character:FindFirstChild("HumanoidRootPart")
if isHooked and hrp then
table.insert(occupiedPositions, hrp.Position)
end
end
end
-- Find nearest empty hook to the downed survivor
local closestHook, hDist = nil, math.huge
for _, h in ipairs(KYS_Cache.Hooks or {}) do
if h.part then
local isOccupied = false
for _, occPos in ipairs(occupiedPositions) do
if (h.part.Position - occPos).Magnitude < 10 then
isOccupied = true
break
end
end
if not isOccupied then
local hd = (h.part.Position - closestDowned.Position).Magnitude
if hd < hDist then
hDist = hd; closestHook = h
end
end
end
end
if closestHook then
IsAutoHooking = true
task.spawn(function()
-- Teleport to downed survivor
root.CFrame = CFrame.new(closestDowned.Position + Vector3.new(0, 3, 0), closestDowned.Position)
task.wait(0.3)
-- Perform Carry via RemoteEvent directly!
pcall(function()
local carryFolder = ReplicatedStorage:FindFirstChild("Remotes"):FindFirstChild("Carry")
local carryEvent = carryFolder and carryFolder:FindFirstChild("CarrySurvivorEvent")
if carryEvent and carryEvent:IsA("RemoteEvent") then
carryEvent:FireServer(closestDowned.Parent)
end
end)
-- Wait for pickup to complete/register
task.wait(0.8)
-- Verify if we successfully picked them up
local currentCarrying = false
local myChar = LocalPlayer.Character
if myChar then
currentCarrying = myChar:GetAttribute("IsCarrying") or myChar:GetAttribute("isCarrying")
end
-- If successfully carrying, teleport to hook
if currentCarrying and root and root.Parent then
-- Teleport to Hook
root.CFrame = CFrame.new(closestHook.part.Position + Vector3.new(0, 3, 0))
task.wait(0.4)
-- Fire Hook Event and Hook Commit
pcall(function()
local carryFolder = ReplicatedStorage:FindFirstChild("Remotes"):FindFirstChild("Carry")
local event = carryFolder and carryFolder:FindFirstChild("HookEvent")
local commit = carryFolder and carryFolder:FindFirstChild("HookCommit")
local hookPoint = nil
if closestHook.model then
hookPoint = closestHook.model:FindFirstChild("HookPoint") or closestHook.model:FindFirstChild("HookHitbox")
end
if not hookPoint then hookPoint = closestHook.part end
if event and event:IsA("RemoteEvent") then
event:FireServer(hookPoint)
end
if commit and commit:IsA("RemoteEvent") then
commit:FireServer(hookPoint)
end
end)
end
task.wait(1)
IsAutoHooking = false
end)
end
end
end
-- =====================================================
-- MAP SCAN LOOP & MAIN AUTO LOOP
-- =====================================================
task.spawn(function()
while not VD.Destroyed do
if Root and KYS_Cache.Hooks and #KYS_Cache.Hooks > 0 then
local closest, closestDist = nil, math.huge
for _, hook in ipairs(KYS_Cache.Hooks) do
if hook.part then
local d = (hook.part.Position - Root.Position).Magnitude
if d < closestDist then
closestDist = d; closest = hook
end
end
end
KYS_Cache.ClosestHook = closest
end
task.wait(0.5)
end
end)
task.spawn(function()
while not VD.Destroyed do
pcall(KYS_AutoAttack)
pcall(KYS_UpdateHitboxes)
pcall(KYS_DestroyAllPallets)
pcall(KYS_AutoBreakGene)
pcall(KYS_BlockAllVaults)
pcall(KYS_BlockAllPalletDrops)
pcall(KYS_BlockPalletDrop)
pcall(KYS_BeatGameSurvivor)
pcall(KYS_BeatGameKiller)
pcall(KYS_AutoHook)
task.wait(0.12)
end
end)
end -- end Auto Features scope
-- =====================================================
-- AIMBOT (Camera-based) + Spear Aimbot
-- =====================================================
local Aimbot = {}
local State = { AimTarget = nil, AimHolding = false }
function Aimbot.GetClosestTarget(cam)
if not cam then return nil end
if GetRole() ~= "Survivor" then return nil end
local root = Root
if not root then return nil end
local closestPlayer = nil
local closestDist = math.huge
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsKiller(player) and player.Character then
local tr = player.Character:FindFirstChild("HumanoidRootPart")
if tr then
local dist = (tr.Position - root.Position).Magnitude
local passVis = true
if VD.AIM_VisCheck then
local camPos = cam.CFrame.Position
local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Blacklist
params.FilterDescendantsInstances = { cam, LocalPlayer.Character, player.Character }
local ray = workspace:Raycast(camPos, tr.Position - camPos, params)
passVis = (ray == nil)
end
if passVis and dist < closestDist then
closestDist = dist
closestPlayer = player
end
end
end
end
return closestPlayer
end
function Aimbot.GetPredictedPosition(target, targetPart)
if not target or not targetPart then return nil end
local pos = targetPart.Position
if VD.AIM_Predict then
local root = target.Character and target.Character:FindFirstChild("HumanoidRootPart")
if root then pos = pos + root.AssemblyLinearVelocity * 0.1 end
end
return pos
end
function Aimbot.AimAt(cam, targetPos)
if not cam or not targetPos then return end
local cur = cam.CFrame
local smooth = VD.AIM_Smooth or 0.3
cam.CFrame = cur:Lerp(CFrame.new(cur.Position, targetPos), smooth)
end
function Aimbot.Update(cam, screenSize, screenCenter)
if not VD.AIM_Enabled or GetRole() ~= "Survivor" then
State.AimTarget = nil; return
end
if VD.AIM_UseRMB and not State.AimHolding then
State.AimTarget = nil; return
end
local target = Aimbot.GetClosestTarget(cam)
State.AimTarget = target
if target and target.Character then
local tr = target.Character:FindFirstChild("HumanoidRootPart")
if tr then
local pred = Aimbot.GetPredictedPosition(target, tr)
if pred then Aimbot.AimAt(cam, pred) end
end
end
end
-- Spear Aimbot (gravity compensation)
function SpearAimbotCalc(targetPos)
if not VD.SPEAR_Aimbot or GetRole() ~= "Killer" then return nil end
local root = Root
if not root then return nil end
local startPos = root.Position + Vector3.new(0, 2, 0)
local distance = (targetPos - startPos).Magnitude
local gravity = VD.SPEAR_Gravity or 50
local speed = VD.SPEAR_Speed or 100
local time = distance / speed
local drop = 0.5 * gravity * time * time
return targetPos + Vector3.new(0, drop, 0)
end
-- =====================================================
-- SPEAR AIMBOT: Manual Target List + Cycle (Panah GUI)
-- =====================================================
function GetSpearTargetList()
local root = Root
local list = {}
if not root then return list end
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsSurvivor(player) and player.Character then
local tr = player.Character:FindFirstChild("HumanoidRootPart")
local th = player.Character:FindFirstChildOfClass("Humanoid")
if tr and th and th.MaxHealth > 0 and (th.Health / th.MaxHealth) > 0.25 then
local dist = (tr.Position - root.Position).Magnitude
table.insert(list, { Player = player, Dist = dist })
end
end
end
table.sort(list, function(a, b) return a.Dist < b.Dist end)
local players = {}
for _, v in ipairs(list) do table.insert(players, v.Player) end
return players
end
function CycleSpearTarget(direction)
local list = GetSpearTargetList()
if #list == 0 then
SpearBtnData.ManualTarget = nil
SpearBtnData.TargetIndex = 0
pcall(VD_Notify, "Spear Aimbot", "Tidak ada target survivor.", 2)
return
end
-- Cari index target saat ini di list terbaru (posisi survivor berubah tiap saat)
local curIdx = nil
if SpearBtnData.ManualTarget then
for i, p in ipairs(list) do
if p == SpearBtnData.ManualTarget then curIdx = i; break end
end
end
local nextIdx
if curIdx then
nextIdx = curIdx + direction
if nextIdx > #list then nextIdx = 1 end
if nextIdx < 1 then nextIdx = #list end
else
nextIdx = 1
end
SpearBtnData.TargetIndex = nextIdx
SpearBtnData.ManualTarget = list[nextIdx]
pcall(VD_Notify, "Spear Aimbot", "Target: " .. SpearBtnData.ManualTarget.Name, 2)
pcall(UpdateSpearTargetLabel)
end
function UpdateSpearTargetLabel()
if not (SpearBtnData and SpearBtnData.TargetLabel) then return end
if SpearBtnData.ManualTarget and SpearBtnData.ManualTarget.Parent then
SpearBtnData.TargetLabel.Text = SpearBtnData.ManualTarget.Name
SpearBtnData.TargetLabel.Visible = true
else
SpearBtnData.TargetLabel.Text = "AUTO"
SpearBtnData.TargetLabel.Visible = true
end
end
function UpdateSpearAim()
if not VD.SPEAR_Aimbot or (SpearBtnData and not SpearBtnData.Active) or GetRole() ~= "Killer" then return end
local root = Root
if not root then return end
local target = nil
-- Pakai target manual kalau masih valid (masih di server, karakter ada, hidup, HP > 25%)
if SpearBtnData.ManualTarget then
local p = SpearBtnData.ManualTarget
local valid = p.Parent and IsSurvivor(p) and p.Character
if valid then
local tr = p.Character:FindFirstChild("HumanoidRootPart")
local th = p.Character:FindFirstChildOfClass("Humanoid")
valid = tr and th and th.MaxHealth > 0 and (th.Health / th.MaxHealth) > 0.25
end
if valid then
target = p
else
-- Target manual sudah tidak valid (mati/keluar) -> balik ke auto
SpearBtnData.ManualTarget = nil
pcall(UpdateSpearTargetLabel)
end
end
-- Fallback: auto pilih target terdekat
if not target then
local closest, closestDist = nil, math.huge
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and IsSurvivor(player) and player.Character then
local tr = player.Character:FindFirstChild("HumanoidRootPart")
local th = player.Character:FindFirstChildOfClass("Humanoid")
if tr and th and th.MaxHealth > 0 and (th.Health / th.MaxHealth) > 0.25 then
local dist = (tr.Position - root.Position).Magnitude
if dist < closestDist then
closestDist = dist; closest = player
end
end
end
end
target = closest
end
if target and target.Character then
local tr = target.Character:FindFirstChild("HumanoidRootPart")
if tr then
local aimPos = SpearAimbotCalc(tr.Position)
if aimPos then
local cam = workspace.CurrentCamera
if cam then cam.CFrame = CFrame.new(cam.CFrame.Position, aimPos) end
end
end
end
end
-- Helper: check if touch is on Gui-mob shoot button (mobile)
local function KYS_IsTouchOnAttackButton(input)
local pos = input.Position
local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
if not playerGui then return false end
local survMob = playerGui:FindFirstChild("Survivor-mob")
if not survMob then return false end
local controls = survMob:FindFirstChild("Controls")
if not controls then return false end
local guiMob = controls:FindFirstChild("Gui-mob")
if not guiMob or not guiMob:IsA("GuiObject") or not guiMob.Visible then return false end
local absPos = guiMob.AbsolutePosition
local absSize = guiMob.AbsoluteSize
return pos.X >= absPos.X and pos.X <= absPos.X + absSize.X
and pos.Y >= absPos.Y and pos.Y <= absPos.Y + absSize.Y
end
UserInputService.InputBegan:Connect(function(input, gpe)
if State.Unloaded then return end
if VD.AIM_Enabled and VD.AIM_UseRMB then
if input.UserInputType == Enum.UserInputType.MouseButton2 then
State.AimHolding = true
elseif input.UserInputType == Enum.UserInputType.Touch and not gpe then
-- Mobile: only lock aimbot when touching attack/shoot button
if KYS_IsTouchOnAttackButton(input) then
State.AimHolding = true
end
end
end
end)
UserInputService.InputEnded:Connect(function(input)
if State.Unloaded then return end
if VD.AIM_Enabled and VD.AIM_UseRMB then
if input.UserInputType == Enum.UserInputType.MouseButton2 or input.UserInputType == Enum.UserInputType.Touch then
State.AimHolding = false
State.AimTarget = nil
end
end
end)
do -- Teleport Tab
local tpMapSection = MappingTab:AddSection({
Position = "Center",
Name = "Teleport",
Icon = "solar:map-point-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
local function getTeleportPlayerNames()
local names = {}
for _, p in ipairs(Players:GetPlayers()) do
if p ~= LocalPlayer then table.insert(names, p.Name) end
end
table.sort(names)
return names
end
local tpPlayerDropdown = tpMapSection:AddDropdown({
Name = "Select Player to Teleport",
Flag = "TP_TargetPlayer",
Values = getTeleportPlayerNames(),
Multi = false,
Callback = function(option)
if type(option) == "table" then option = option[1] end
VD.TP_TargetPlayer = option or ""
end
})
tpMapSection:AddButton({ Name = "Refresh Players", Callback = function()
pcall(function() tpPlayerDropdown:SetValues(getTeleportPlayerNames()) end)
end })
tpMapSection:AddButton({ Name = "Teleport to Player", Callback = function()
pcall(function()
local targetName = VD.TP_TargetPlayer
if not targetName or targetName == "" then return end
local player = Players:FindFirstChild(targetName)
local root = Root
local targetRoot = player and player.Character and player.Character:FindFirstChild("HumanoidRootPart")
if root and targetRoot then
root.CFrame = targetRoot.CFrame * CFrame.new(0, 0, 3)
end
end)
end })
tpMapSection:AddButton({ Name = "TP to Gen", Callback = function() pcall(function() KYS_TeleportToGenerator(1) end) end })
tpMapSection:AddButton({ Name = "TP to Gate", Callback = function() pcall(KYS_TeleportToGate) end })
tpMapSection:AddButton({ Name = "TP to Hook", Callback = function() pcall(KYS_TeleportToHook) end })
end
do -- Radar Tab
local radarTab = MappingFeatureTabs.Radar
if radarTab then
local radarSection = radarTab:AddSection({
Position = "Center",
Name = "Radar Configuration",
Icon = "solar:radar-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
radarSection:AddToggle({
Default = false,
Name = "Radar Enabled", Flag = "Radar Enabled",
Callback = function(state)
VD.RADAR_Enabled = state
if not state and radarGui then radarGui.Enabled = false end
end
})
radarSection:AddSlider({
Name = "Radar Size", Flag = "Radar Size",
Min = 100, Max = 300, Default = 150,
Callback = function(value) VD.RADAR_Size = value end
})
radarSection:AddSlider({
Name = "Radar Range", Flag = "Radar Range",
Min = 50, Max = 500, Default = 250,
Callback = function(value) VD.RADAR_Range = value end
})
radarSection:AddSlider({
Name = "Radar Transparency", Flag = "Radar Transparency",
Min = 0, Max = 100, Default = 20,
Callback = function(value) VD.RADAR_Transparency = value / 100 end
})
radarSection:AddToggle({
Default = false,
Name = "Radar Circle Mode", Flag = "Radar Circle Mode",
Callback = function(state) VD.RADAR_Circle = state end
})
local radarFilterSection = radarTab:AddSection({
Position = "Center",
Name = "Radar Filters",
Icon = "solar:filter-bold",
Box = true,
BoxBorder = true,
Opened = false,
})
radarFilterSection:AddToggle({ Default = false, Name = "Show Killer", Flag = "Radar Show Killer", Callback = function(state) VD.RADAR_ShowKiller = state end })
radarFilterSection:AddToggle({ Default = false, Name = "Show Survivor", Flag = "Radar Show Survivor", Callback = function(state) VD.RADAR_ShowSurvivor = state end })
radarFilterSection:AddToggle({ Default = false, Name = "Show Generator", Flag = "Radar Show Generator", Callback = function(state) VD.RADAR_ShowGenerator = state end })
radarFilterSection:AddToggle({ Default = false, Name = "Show Pallet", Flag = "Radar Show Pallet", Callback = function(state) VD.RADAR_ShowPallet = state end })
radarFilterSection:AddToggle({ Default = false, Name = "Show Hook", Flag = "Radar Show Hook", Callback = function(state) VD.RADAR_ShowHook = state end })
radarFilterSection:AddToggle({ Default = false, Name = "Show Gate", Flag = "Radar Show Gate", Callback = function(state) VD.RADAR_ShowGate = state end })
radarFilterSection:AddToggle({ Default = false, Name = "ShowWindow", Flag = "Radar Show Window", Callback = function(state) VD.RADAR_ShowWindow = state end })
radarFilterSection:AddToggle({ Default = false, Name = "Show Zombie", Flag = "Radar Show Zombie", Callback = function(state) VD.RADAR_ShowZombie = state end })
end
end
-- =====================================================
-- REMOVE PALLETWRONG (replaces patched No Pallet Stun)
-- =====================================================
function SetupNoPalletStun()
pcall(VD_UpdateRemovePalletwrong)
end
-- =====================================================
-- ANTI BLIND (Flashlight)
-- =====================================================
function SetupAntiBlind()
pcall(function()
local r = ReplicatedStorage:FindFirstChild("Remotes")
local i = r and r:FindFirstChild("Items")
local fl = i and i:FindFirstChild("Flashlight")
local gb = fl and fl:FindFirstChild("GotBlinded")
if not (gb and gb:IsA("RemoteEvent")) then return end
local ok, mt = pcall(function() return getrawmetatable(game) end)
if ok and mt and setreadonly then
pcall(function()
setreadonly(mt, false)
local old = mt.__namecall
local _genv = getgenv()
mt.__namecall = newcclosure(function(self, ...)
if not checkcaller() and _genv.VD and _genv.VD.KILLER_AntiBlind and self == gb then
local method = getnamecallmethod()
if method == "FireServer" and GetRole() == "Killer" then
return nil -- Block pengiriman sinyal buta
end
end
return old(self, ...)
end)
setreadonly(mt, true)
end)
end
end)
end
pcall(SetupAntiBlind)
-- =====================================================
-- KYST KILLER DISPLAY
-- =====================================================
getgenv().KYS_KystKillerGui = nil
getgenv().KYS_KystKillerRunning = false
function SetupKystKillerIndicator()
if getgenv().KYS_KystKillerGui then pcall(function() getgenv().KYS_KystKillerGui:Destroy() end) end
getgenv().KYS_KystKillerGui = nil
KYS_SetMainInfoPanelText("KystKiller", "Kyst Killer Display", "Waiting...")
end
function StartKystKiller()
if getgenv().KYS_KystKillerRunning then return end
getgenv().KYS_KystKillerRunning = true
SetupKystKillerIndicator()
task.spawn(function()
local _genv = getgenv()
while _genv.VD and _genv.VD.VIS_KystKiller and _genv.KYS_KystKillerRunning do
local playersList = Players:GetPlayers()
table.sort(playersList, function(a, b)
local aA = a:GetAttribute("AllowKiller") or false
local bB = b:GetAttribute("AllowKiller") or false
if aA ~= bB then return aA == true end
return (a:GetAttribute("KillerChance") or 0) > (b:GetAttribute("KillerChance") or 0)
end)
local nk = playersList[1]
if nk then
KYS_SetMainInfoPanelText("KystKiller", "Kyst Killer Display", "Kyst Killer: " .. (nk == LocalPlayer and "YOU" or nk.DisplayName or nk.Name))
else
KYS_SetMainInfoPanelText("KystKiller", "Kyst Killer Display", "Kyst Killer: None")
end
task.wait(2)
end
end)
end
function StopKystKiller()
getgenv().KYS_KystKillerRunning = false
if getgenv().KYS_KystKillerGui then
pcall(function() getgenv().KYS_KystKillerGui:Destroy() end)
getgenv().KYS_KystKillerGui = nil
end
KYS_SetMainInfoPanelText("KystKiller", "Kyst Killer Display", "Off")
end
-- =====================================================
-- SPECTATOR COUNTER
-- =====================================================
if getgenv().KYS_SpectatorCounterGui then
pcall(function() getgenv().KYS_SpectatorCounterGui:Destroy() end)
end
getgenv().KYS_SpectatorCounterGui = nil
getgenv().KYS_SpectatorCounterRunning = false
function SetupSpectatorCounter()
if getgenv().KYS_SpectatorCounterGui then pcall(function() getgenv().KYS_SpectatorCounterGui:Destroy() end) end
local sg = Instance.new("ScreenGui")
sg.Name = "KYS_SpectatorCounterGui"
sg.ResetOnSpawn = false
local frame = Instance.new("Frame")
frame.Name = "CounterFrame"
frame.Size = UDim2.new(0, 88, 0, 28)
frame.Position = UDim2.new(0.02, 0, 0.1, 0)
frame.BackgroundColor3 = Color3.fromRGB(18, 18, 24)
frame.BackgroundTransparency = 0.18
frame.BorderSizePixel = 0
frame.Parent = sg
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 9)
local stroke = Instance.new("UIStroke")
stroke.Color = Color3.fromRGB(255, 0, 0)
stroke.Thickness = 1
stroke.Transparency = 0.35
stroke.Parent = frame
local layout = Instance.new("UIListLayout")
layout.FillDirection = Enum.FillDirection.Horizontal
layout.HorizontalAlignment = Enum.HorizontalAlignment.Center
layout.VerticalAlignment = Enum.VerticalAlignment.Center
layout.Padding = UDim.new(0, 8)
layout.Parent = frame
local icon = Instance.new("ImageLabel")
icon.Name = "Icon"
icon.Size = UDim2.new(0, 18, 0, 18)
icon.BackgroundTransparency = 1
icon.Image = "rbxassetid://13321848320"
icon.ImageColor3 = Color3.fromRGB(205, 185, 255)
icon.Parent = frame
local label = Instance.new("TextLabel")
label.Name = "SpectatorCount"
label.Size = UDim2.new(0, 42, 0, 28)
label.BackgroundTransparency = 1
label.Font = Enum.Font.GothamBold
label.Text = "0"
label.TextColor3 = Color3.fromRGB(240, 240, 240)
label.TextSize = 15
label.TextXAlignment = Enum.TextXAlignment.Left
label.Parent = frame
local pg = GetSafeGuiParent()
if pg then
local oldGui = pg:FindFirstChild("KYS_SpectatorCounterGui")
if oldGui then pcall(function() oldGui:Destroy() end) end
sg.Parent = pg
else
task.spawn(function()
local pgui = LocalPlayer:WaitForChild("PlayerGui", 10)
if pgui then sg.Parent = pgui end
end)
end
getgenv().KYS_SpectatorCounterGui = sg
end
function StartSpectatorCounter()
if getgenv().KYS_SpectatorCounterRunning then return end
getgenv().KYS_SpectatorCounterRunning = true
SetupSpectatorCounter()
task.spawn(function()
local _genv = getgenv()
while _genv.VD and _genv.VD.VIS_SpectatorCounter and _genv.KYS_SpectatorCounterRunning and getgenv().KYS_SpectatorCounterGui do
local sg = getgenv().KYS_SpectatorCounterGui
if not sg or not sg.Parent then break end
local count = 0
for _, player in ipairs(Players:GetPlayers()) do
if player.Team and player.Team.Name == "Spectator" then
count = count + 1
end
end
local label = sg:FindFirstChild("SpectatorCount", true)
if label then
label.Text = tostring(count)
end
task.wait(1)
end
end)
end
function StopSpectatorCounter()
getgenv().KYS_SpectatorCounterRunning = false
if getgenv().KYS_SpectatorCounterGui then
pcall(function() getgenv().KYS_SpectatorCounterGui:Destroy() end)
getgenv().KYS_SpectatorCounterGui = nil
end
end
-- =====================================================
-- KILLER PERKS DISPLAY
-- Reads killer perk objects directly from Workspace character models.
-- =====================================================
do -- begin Killer Perks scope
if getgenv().KYS_KillerPerksGui then
pcall(function() getgenv().KYS_KillerPerksGui:Destroy() end)
end
getgenv().KYS_KillerPerksGui = nil
local KYS_KillerPerksCollapsed = false
local KYS_KillerPerksLocked = false
getgenv().KYS_KillerPerksRunning = false
local KYS_KillerPerkNames = {
KystInLine = "Kyst in Line",
["Kyst in Line"] = "Kyst in Line",
EchoLocation = "Echo Location",
["Echo Location"] = "Echo Location",
KingsScourge = "King's Scourge",
KingScourge = "King's Scourge",
["King's Scourge"] = "King's Scourge",
}
function KYS_EscapeRichText(text)
text = tostring(text or "")
text = text:gsub("&", "&")
text = text:gsub("<", "<")
text = text:gsub(">", ">")
return text
end
local function KYS_FormatPerkName(name)
name = tostring(name or "")
if KYS_KillerPerkNames[name] then return KYS_KillerPerkNames[name] end
local clean = name:gsub("_", " "):gsub("-", " ")
clean = clean:gsub("(%l)(%u)", "%1 %2")
clean = clean:gsub("(%a)(%d)", "%1 %2")
clean = clean:gsub("(%d)(%a)", "%1 %2")
clean = clean:gsub("%s+", " "):gsub("^%s+", ""):gsub("%s+$", "")
return clean ~= "" and clean or "Unknown Perk"
end
local function KYS_GetKillerPlayer()
for _, player in ipairs(Players:GetPlayers()) do
local teamName = player.Team and player.Team.Name
if teamName and teamName:lower():find("killer") then
return player
end
end
return nil
end
local function KYS_AddWorkspacePerk(result, seen, rawName, displayName, level)
if not rawName then return end
rawName = tostring(rawName)
if rawName == "" or rawName == "nil" then return end
if rawName:lower():find("template") then return end
if seen[rawName] then return end
seen[rawName] = true
table.insert(result, {
Raw = rawName,
Name = displayName and tostring(displayName) or KYS_FormatPerkName(rawName),
Level = level and tostring(level) or nil,
})
end
local function KYS_IsPerkContainer(inst)
local name = inst.Name:lower()
return name == "perks"
or name == "killerperks"
or name == "equippedperks"
or name == "equippedkillerperks"
or name:find("perkfolder") ~= nil
or name:find("perklist") ~= nil
end
local function KYS_ParseWorkspacePerkName(name)
name = tostring(name or "")
local perkName, level = name:match("^(.+)%s+(%d+)$")
if not perkName then return nil end
perkName = perkName:gsub("^%s+", ""):gsub("%s+$", "")
if perkName == "" then return nil end
local lower = perkName:lower()
local excluded = {
head = true,
torso = true,
humanoid = true,
["left arm"] = true,
["right arm"] = true,
["left leg"] = true,
["right leg"] = true,
["humanoidrootpart"] = true,
}
if excluded[lower] then return nil end
return perkName, level
end
local function KYS_ReadPerksFromWorkspace(killer)
if not killer then return {} end
local char = killer.Character or Workspace:FindFirstChild(killer.Name) or Workspace:FindFirstChild(killer.DisplayName)
if not char then return {} end
local result = {}
local seen = {}
local function scanAttributes(inst)
if not inst.GetAttributes then return end
local attrs = inst:GetAttributes()
for key, value in pairs(attrs) do
local lowerKey = tostring(key):lower()
if lowerKey:find("perk") then
if type(value) == "string" then
KYS_AddWorkspacePerk(result, seen, value)
elseif value == true then
KYS_AddWorkspacePerk(result, seen, key)
elseif type(value) == "number" and lowerKey:find("level") then
local baseName = tostring(key):gsub("[Ll]evel", ""):gsub("[Pp]erk", "")
if baseName ~= "" then
KYS_AddWorkspacePerk(result, seen, baseName, nil, value)
end
end
end
end
end
local function readValueObject(inst)
if inst:IsA("StringValue") then
return inst.Value
elseif inst:IsA("IntValue") or inst:IsA("NumberValue") then
return inst.Name, inst.Value
elseif inst:IsA("BoolValue") and inst.Value == true then
return inst.Name
end
return nil
end
scanAttributes(char)
for _, child in ipairs(char:GetChildren()) do
local perkName, level = KYS_ParseWorkspacePerkName(child.Name)
if perkName then
KYS_AddWorkspacePerk(result, seen, child.Name, perkName, level)
end
end
for _, inst in ipairs(char:GetDescendants()) do
scanAttributes(inst)
if KYS_IsPerkContainer(inst) then
for _, child in ipairs(inst:GetChildren()) do
local value, level = readValueObject(child)
KYS_AddWorkspacePerk(result, seen, value or child.Name, nil, level)
end
else
local lowerName = inst.Name:lower()
if lowerName:find("perk") then
local value, level = readValueObject(inst)
KYS_AddWorkspacePerk(result, seen, value or inst.Name, nil, level)
end
end
end
table.sort(result, function(a, b) return tostring(a.Name) < tostring(b.Name) end)
return result
end
local function KYS_BuildKillerPerksText()
local killer = KYS_GetKillerPlayer()
local killerName = killer and (killer.DisplayName or killer.Name) or "Unknown"
local perks = KYS_ReadPerksFromWorkspace(killer)
if #perks == 0 then
for _, player in ipairs(Players:GetPlayers()) do
local candidatePerks = KYS_ReadPerksFromWorkspace(player)
if #candidatePerks > 0 then
killer = player
killerName = player.DisplayName or player.Name
perks = candidatePerks
break
end
end
end
local lines = {
'Killer Perks [' .. KYS_EscapeRichText(killerName) .. ']',
}
if #perks == 0 then
table.insert(lines, '- Waiting for perk data...')
else
for i = 1, math.min(#perks, 4) do
local perk = perks[i]
local levelText = perk.Level and (" lvl " .. tostring(perk.Level)) or ""
table.insert(lines, '- ' .. KYS_EscapeRichText(perk.Name) .. KYS_EscapeRichText(levelText) .. '')
end
end
return table.concat(lines, "\n"), #perks
end
local function SetupKillerPerksDisplay()
if getgenv().KYS_KillerPerksGui then pcall(function() getgenv().KYS_KillerPerksGui:Destroy() end) end
getgenv().KYS_KillerPerksGui = nil
KYS_SetMainInfoPanelText("KillerPerks", "Spectate Killer Perks", "Waiting for perk data...")
end
function StartKillerPerksDisplay()
if getgenv().KYS_KillerPerksRunning then return end
getgenv().KYS_KillerPerksRunning = true
SetupKillerPerksDisplay()
task.spawn(function()
local _genv = getgenv()
while _genv.VD and _genv.VD.VIS_KillerPerks and _genv.KYS_KillerPerksRunning do
local text = KYS_BuildKillerPerksText()
KYS_SetMainInfoPanelText("KillerPerks", "Spectate Killer Perks", text)
task.wait(1)
end
end)
end
function StopKillerPerksDisplay()
getgenv().KYS_KillerPerksRunning = false
if getgenv().KYS_KillerPerksGui then
pcall(function() getgenv().KYS_KillerPerksGui:Destroy() end)
getgenv().KYS_KillerPerksGui = nil
end
KYS_SetMainInfoPanelText("KillerPerks", "Spectate Killer Perks", "Off")
end
end -- end Killer Perks scope
-- =====================================================
-- PREDICT MAP
-- Tries early map data remotes first, then confirms from workspace.Map.
-- =====================================================
do -- begin Predict Map scope
if getgenv().KYS_PredictMapGui then
pcall(function() getgenv().KYS_PredictMapGui:Destroy() end)
end
if getgenv().KYS_PredictMapConnections then
for _, conn in ipairs(getgenv().KYS_PredictMapConnections) do
pcall(function() conn:Disconnect() end)
end
end
getgenv().KYS_PredictMapGui = nil
getgenv().KYS_PredictMapConnections = {}
getgenv().KYS_PredictMapRunning = false
local KYS_PredictMapState = {
Name = "Unknown",
Desc = "Waiting for map data...",
Source = "Idle",
Phase = "",
TimeLeft = nil,
}
local function KYS_MapStringFromValue(value)
if type(value) == "string" then
return value
elseif typeof and typeof(value) == "Instance" then
return value.Name
elseif type(value) == "table" then
return value.Title
or value.title
or value.Name
or value.name
or value.Map
or value.map
or value.MapName
or value.mapName
or value.Location
or value.location
end
return nil
end
local function KYS_MapDescFromValue(value)
if type(value) ~= "table" then return nil end
return value.Desc or value.desc or value.Description or value.description
end
local function KYS_SetPredictedMap(name, desc, source)
name = KYS_MapStringFromValue(name) or name
if not name or tostring(name) == "" then return end
KYS_PredictMapState.Name = tostring(name)
if desc and tostring(desc) ~= "" then
KYS_PredictMapState.Desc = tostring(desc)
end
KYS_PredictMapState.Source = source or "Detected"
end
local function KYS_ReadCurrentWorkspaceMap()
local map = Workspace:FindFirstChild("Map")
if not map then return nil end
local camScene = map:FindFirstChild("Camerascene1", true)
local title = camScene and camScene:GetAttribute("title")
local desc = camScene and camScene:GetAttribute("desc")
if title then
return tostring(title), desc and tostring(desc) or nil
end
for _, child in ipairs(map:GetChildren()) do
local childTitle = child:GetAttribute("title") or child:GetAttribute("Title") or child:GetAttribute("MapName")
if childTitle then
return tostring(childTitle), child:GetAttribute("desc") or child:GetAttribute("Description")
end
end
return map.Name ~= "Map" and map.Name or "Map Loaded", nil
end
local function KYS_TryPredictMapRemote()
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
local mechanics = remotes and remotes:FindFirstChild("Mechanics")
local chat = mechanics and mechanics:FindFirstChild("Chat")
local getMapData = chat and chat:FindFirstChild("GetMapData")
if not (getMapData and getMapData:IsA("RemoteFunction")) then return false end
local attempts = {
{},
{ "Current" },
{ "Kyst" },
{ "Map" },
}
for _, args in ipairs(attempts) do
local ok, data = pcall(function()
return getMapData:InvokeServer(table.unpack(args))
end)
if ok and data ~= nil then
local name = KYS_MapStringFromValue(data)
local desc = KYS_MapDescFromValue(data)
if name then
KYS_SetPredictedMap(name, desc, "Predicted")
return true
end
end
end
return false
end
local function KYS_PredictMapText()
local name = KYS_EscapeRichText(KYS_PredictMapState.Name or "Unknown")
local source = KYS_EscapeRichText(KYS_PredictMapState.Source or "Idle")
local phase = tostring(KYS_PredictMapState.Phase or "")
local timeLeft = KYS_PredictMapState.TimeLeft
local timerText = ""
if timeLeft then
timerText = " [" .. phase .. " " .. tostring(timeLeft) .. "s]"
elseif phase ~= "" then
timerText = " [" .. phase .. "]"
end
local lines = {
'Map: ' .. name .. '',
'' .. source .. timerText .. '',
}
return table.concat(lines, "\n")
end
local function SetupPredictMapGui()
if getgenv().KYS_PredictMapGui then pcall(function() getgenv().KYS_PredictMapGui:Destroy() end) end
getgenv().KYS_PredictMapGui = nil
KYS_SetMainInfoPanelText("PredictMap", "Predict Map", KYS_PredictMapText())
end
local function KYS_BindPredictMapEvents()
local conns = getgenv().KYS_PredictMapConnections
local remotes = ReplicatedStorage:FindFirstChild("Remotes")
if not remotes then return end
local messages = remotes:FindFirstChild("Messages")
local mapInfo = messages and messages:FindFirstChild("Mapinfo")
if mapInfo and mapInfo:IsA("RemoteEvent") then
table.insert(conns, mapInfo.OnClientEvent:Connect(function(a, b, c)
local name = KYS_MapStringFromValue(a) or KYS_MapStringFromValue(b) or KYS_MapStringFromValue(c)
local desc = KYS_MapDescFromValue(a) or KYS_MapDescFromValue(b) or KYS_MapDescFromValue(c)
if name then
KYS_SetPredictedMap(name, desc, "Predicted")
end
end))
end
local timeEvent = remotes:FindFirstChild("TimeUpdateEvent")
if timeEvent and timeEvent:IsA("RemoteEvent") then
table.insert(conns, timeEvent.OnClientEvent:Connect(function(phase, timeLeft)
KYS_PredictMapState.Phase = tostring(phase or "")
KYS_PredictMapState.TimeLeft = tonumber(timeLeft)
if tostring(phase) == "Intermission" and tonumber(timeLeft) and tonumber(timeLeft) <= 20 then
pcall(KYS_TryPredictMapRemote)
end
end))
end
table.insert(conns, Workspace.ChildAdded:Connect(function(child)
if child and child.Name == "Map" then
task.delay(0.25, function()
local name, desc = KYS_ReadCurrentWorkspaceMap()
if name then KYS_SetPredictedMap(name, desc, "Confirmed") end
end)
end
end))
end
function StartPredictMap()
if getgenv().KYS_PredictMapRunning then return end
getgenv().KYS_PredictMapRunning = true
SetupPredictMapGui()
KYS_BindPredictMapEvents()
task.spawn(function()
while VD and VD.VIS_PredictMap and getgenv().KYS_PredictMapRunning do
local currentName, currentDesc = KYS_ReadCurrentWorkspaceMap()
if currentName then
KYS_SetPredictedMap(currentName, currentDesc, "Confirmed")
else
pcall(KYS_TryPredictMapRemote)
end
KYS_SetMainInfoPanelText("PredictMap", "Predict Map", KYS_PredictMapText())
task.wait(1)
end
end)
end
function StopPredictMap()
getgenv().KYS_PredictMapRunning = false
if getgenv().KYS_PredictMapGui then
pcall(function() getgenv().KYS_PredictMapGui:Destroy() end)
getgenv().KYS_PredictMapGui = nil
end
if getgenv().KYS_PredictMapConnections then
for _, conn in ipairs(getgenv().KYS_PredictMapConnections) do
pcall(function() conn:Disconnect() end)
end
end
getgenv().KYS_PredictMapConnections = {}
KYS_SetMainInfoPanelText("PredictMap", "Predict Map", "Off")
end
end -- end Predict Map scope
-- =====================================================
-- CAMERA / FOV / THIRD PERSON / SHIFT LOCK
-- =====================================================
getgenv().KYS_OriginalFOV = nil
getgenv().KYS_OriginalCameraType = nil
getgenv().KYS_OriginalCameraOffset = nil
getgenv().KYS_ThirdPersonWasActive = false
getgenv().KYS_FOVWasActive = false
function UpdateCameraFOV()
local cam = workspace.CurrentCamera
if not cam then return end
if VD.CAM_FOVEnabled then
if not getgenv().KYS_FOVWasActive then
getgenv().KYS_OriginalFOV = cam.FieldOfView
getgenv().KYS_FOVWasActive = true
end
cam.FieldOfView = VD.CAM_FOV or 90
elseif getgenv().KYS_FOVWasActive then
if getgenv().KYS_OriginalFOV then cam.FieldOfView = getgenv().KYS_OriginalFOV end
getgenv().KYS_OriginalFOV = nil
getgenv().KYS_FOVWasActive = false
end
end
function UpdateThirdPerson()
local cam = workspace.CurrentCamera
if not cam then return end
local shouldBeActive = VD.CAM_ThirdPerson and GetRole() == "Killer"
if shouldBeActive then
if not getgenv().KYS_ThirdPersonWasActive then
getgenv().KYS_OriginalCameraType = cam.CameraType
local char = LocalPlayer.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
getgenv().KYS_OriginalCameraOffset = hum and hum.CameraOffset or Vector3.new(0, 0, 0)
end
cam.CameraType = Enum.CameraType.Custom
local char = LocalPlayer.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if hum then hum.CameraOffset = Vector3.new(2, 1, 8) end
getgenv().KYS_ThirdPersonWasActive = true
elseif getgenv().KYS_ThirdPersonWasActive then
if getgenv().KYS_OriginalCameraType then
cam.CameraType = getgenv().KYS_OriginalCameraType; getgenv().KYS_OriginalCameraType = nil
end
local char = LocalPlayer.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if hum then hum.CameraOffset = getgenv().KYS_OriginalCameraOffset or Vector3.new(0, 0, 0) end
getgenv().KYS_OriginalCameraOffset = nil
getgenv().KYS_ThirdPersonWasActive = false
end
end
getgenv().KYS_shiftLockWasActive = false
function UpdateShiftLock()
local char = LocalPlayer.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local root = char and char:FindFirstChild("HumanoidRootPart")
local cam = workspace.CurrentCamera
if VD.CAM_ShiftLock then
if not char or not root or not cam then return end
-- Matikan rotasi bawaan game saat jalan
if hum then hum.AutoRotate = false end
getgenv().KYS_shiftLockWasActive = true
local flatLook = Vector3.new(cam.CFrame.LookVector.X, 0, cam.CFrame.LookVector.Z)
-- Cegah NaN kalau arah kamera tegak lurus ke atas/bawah
if flatLook.Magnitude > 0.001 then
local lookUnit = flatLook.Unit
root.CFrame = CFrame.new(root.Position, root.Position + lookUnit)
end
else
-- Kembalikan rotasi bawaan kalau shiftlock dimatikan
if getgenv().KYS_shiftLockWasActive then
if hum then hum.AutoRotate = true end
getgenv().KYS_shiftLockWasActive = false
end
end
end
-- =====================================================
-- NO FOG
-- =====================================================
getgenv().KYS_FogCache = {}
function RemoveFog()
pcall(function()
local map = Workspace:FindFirstChild("Map")
if map then
for _, obj in ipairs(map:GetDescendants()) do
if obj.Name:lower():find("fog") or obj:IsA("Atmosphere") or obj:IsA("BloomEffect") or obj:IsA("BlurEffect") or obj:IsA("ColorCorrectionEffect") then
if not getgenv().KYS_FogCache[obj] then
getgenv().KYS_FogCache[obj] = {
enabled = obj:IsA("PostEffect") and obj.Enabled or true,
parent =
obj.Parent
}
end
if obj:IsA("PostEffect") then obj.Enabled = false else obj.Parent = nil end
end
end
end
end)
pcall(function()
local lt = game:GetService("Lighting")
for _, obj in ipairs(lt:GetChildren()) do
if obj:IsA("Atmosphere") or obj.Name:lower():find("fog") then
if not getgenv().KYS_FogCache[obj] then getgenv().KYS_FogCache[obj] = { enabled = true, parent = obj.Parent } end
if obj:IsA("Atmosphere") then obj.Density = 0 else obj.Parent = nil end
end
end
lt.FogEnd = 100000
lt.FogStart = 0
end)
end
function RestoreFog()
pcall(function()
for obj, data in pairs(getgenv().KYS_FogCache) do
if obj and data.parent then
if obj:IsA("PostEffect") then obj.Enabled = data.enabled else obj.Parent = data.parent end
end
end
getgenv().KYS_FogCache = {}
game:GetService("Lighting").FogEnd = 1000
end)
end
-- =====================================================
-- NO SLOWDOWN
-- =====================================================
function UpdateNoSlowdown()
if not VD.KILLER_NoSlowdown or GetRole() ~= "Killer" then return end
local char = LocalPlayer.Character
if not char then return end
local hum = char:FindFirstChildOfClass("Humanoid")
if hum and hum.WalkSpeed < 16 then hum.WalkSpeed = VD.SPEED_Value or 16 end
end
-- =====================================================
-- KUNCI KECEPATAN / ANTI BEKU (__newindex Hook)
-- =====================================================
function SetupAntiStunSlowdown()
if getgenv().KYS_AntiStunHooked then return end
getgenv().KYS_AntiStunHooked = true
pcall(function()
local ok, mt = pcall(function() return getrawmetatable(game) end)
if ok and mt and setreadonly then
pcall(function()
setreadonly(mt, false)
local oldNI = mt.__newindex
local _genv = getgenv()
mt.__newindex = newcclosure(function(t, k, v)
if k == "WalkSpeed" or k == "Anchored" then
if not checkcaller() and _genv.VD and _genv.VD.KILLER_NoSlowdown and GetRole() == "Killer" then
-- Cegah perintah yang mengurangi WalkSpeed drastis (Efek Stun/Kesandung)
if k == "WalkSpeed" and typeof(v) == "number" and v < 16 and typeof(t) == "Instance" and t:IsA("Humanoid") then
return oldNI(t, k, _genv.VD.SPEED_Value or 16)
end
-- Cegah perintah yang membekukan posisi karakter (Anchored Stun)
if k == "Anchored" and v == true and typeof(t) == "Instance" and t:IsA("BasePart") and t.Name == "HumanoidRootPart" then
return oldNI(t, k, false)
end
end
end
return oldNI(t, k, v)
end)
setreadonly(mt, true)
end)
end
end)
end
task.spawn(SetupAntiStunSlowdown)
-- =====================================================
-- FOV CIRCLE
-- =====================================================
local FOVCircle = nil
if DrawingAvailable then
FOVCircle = SafeDrawing("Circle")
if FOVCircle then
FOVCircle.Thickness = 1
FOVCircle.Color = Color3.fromRGB(220, 70, 70)
FOVCircle.Filled = false
FOVCircle.NumSides = 64
FOVCircle.Transparency = 0.8
FOVCircle.Visible = false
end
end
-- =====================================================
-- NO CUTSCENE BYPASS & HOOK
-- =====================================================
local fakeBindable = Instance.new("BindableEvent")
local fakeRemote = Instance.new("RemoteEvent")
function SetupNoCutsceneHook()
if getgenv().KYS_NoCutsceneHooked then return end
getgenv().KYS_NoCutsceneHooked = true
pcall(function()
local ok, mt = pcall(function() return getrawmetatable(game) end)
if ok and mt and setreadonly then
pcall(function()
setreadonly(mt, false)
local oldIndex = mt.__index
local _genv = getgenv()
mt.__index = newcclosure(function(t, k)
if k == "OnClientEvent" or k == "Event" then
if _genv.VD and _genv.VD.NoCutscene and not checkcaller() and typeof(t) == "Instance" then
local name = t.Name
if name == "cutscene" and k == "Event" then
local parent = t.Parent
if parent and parent.Name == "Game" then
return fakeBindable.Event
end
elseif (name == "cutsceneEnd" or name == "cutsceneEnd2" or name == "cutsceneEndwithownchar" or name == "endscreencutscene") then
local parent = t.Parent
if parent and parent.Name == "Game" then
return fakeRemote.OnClientEvent
end
end
end
end
return oldIndex(t, k)
end)
setreadonly(mt, true)
end)
end
end)
end
function KYS_SetupNoCutsceneListeners()
task.spawn(function()
local gameFolder = ReplicatedStorage:WaitForChild("Remotes", 10):WaitForChild("Game", 10)
if not gameFolder then return end
local endscreencutscene = gameFolder:WaitForChild("endscreencutscene", 10)
local cutsceneEnd = gameFolder:WaitForChild("cutsceneEnd", 10)
local cutsceneEnd2 = gameFolder:WaitForChild("cutsceneEnd2", 10)
local cutsceneEndwithownchar = gameFolder:WaitForChild("cutsceneEndwithownchar", 10)
function showInstantResults()
if not getgenv().VD or not getgenv().VD.NoCutscene then return end
pcall(function()
local cam = workspace.CurrentCamera
if cam then
cam.CameraType = Enum.CameraType.Custom
cam.FieldOfView = 70
end
game:GetService("UserInputService").MouseIconEnabled = true
pcall(function() game:GetService("SoundService"):WaitForChild("chase").Volume = 0 end)
LocalPlayer:SetAttribute("isspectating", true)
local pg = LocalPlayer:FindFirstChild("PlayerGui")
if pg then
local Results = pg:FindFirstChild("Results")
local EndScreen = pg:FindFirstChild("EndScreen")
local Darkness = pg:FindFirstChild("Darkness")
if Results then Results.Enabled = true end
if EndScreen then
EndScreen.Enabled = true
local blackout = EndScreen:FindFirstChild("blackout")
if blackout then blackout.BackgroundTransparency = 1 end
end
if Darkness then
Darkness.Enabled = true
local frame2 = Darkness:FindFirstChild("Frame2")
if frame2 then frame2.BackgroundTransparency = 1 end
end
end
end)
end
if endscreencutscene then endscreencutscene.OnClientEvent:Connect(showInstantResults) end
if cutsceneEnd then cutsceneEnd.OnClientEvent:Connect(showInstantResults) end
if cutsceneEnd2 then cutsceneEnd2.OnClientEvent:Connect(showInstantResults) end
if cutsceneEndwithownchar then cutsceneEndwithownchar.OnClientEvent:Connect(showInstantResults) end
end)
end
task.spawn(SetupNoCutsceneHook)
task.spawn(KYS_SetupNoCutsceneListeners)
-- =====================================================
-- RENDERSTEP: Drawing ESP / Aimbot / Camera
-- =====================================================
function OnRenderStep()
if VD.Destroyed then
if DrawingAvailable then
if FOVCircle then SafeRemove(FOVCircle) end
end
return
end
Camera = Workspace.CurrentCamera or Camera
local cam = Camera
if not cam then return end
local screenSize = cam.ViewportSize
local screenCenter = Vector2.new(screenSize.X / 2, screenSize.Y / 2)
-- Aimbot
pcall(function()
if VD.AIM_Enabled then
Aimbot.Update(cam, cam.ViewportSize, Vector2.new(cam.ViewportSize.X / 2, cam.ViewportSize.Y / 2))
end
end)
pcall(UpdateSpearAim)
UpdateCameraFOV()
UpdateThirdPerson()
UpdateShiftLock()
-- FOV circle
if FOVCircle and DrawingAvailable then
if VD.AIM_Enabled and VD.AIM_ShowFOV then
FOVCircle.Position = screenCenter
FOVCircle.Radius = VD.AIM_FOV or 120
FOVCircle.Color = State.AimTarget and Color3.fromRGB(90, 220, 120) or Color3.fromRGB(220, 70, 70)
FOVCircle.Visible = true
else
FOVCircle.Visible = false
end
end
end
-- =====================================================
-- MOBILE GUI (Aimbot Button + FOV Circle)
-- =====================================================
getgenv().KYS_MobileGui = getgenv().KYS_MobileGui or { AimBtn=nil, FOVFrame=nil, FOVStroke=nil }
function CreateMobileUI()
local pg = GetSafeGuiParent()
if not pg then return end
-- === MAIN SCREENGUI ===
local sg = Instance.new("ScreenGui")
sg.Name = "KYS_MobileUI"
sg.ResetOnSpawn = false
sg.IgnoreGuiInset = true
sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
sg.DisplayOrder = 100
sg.Parent = pg
-- === FOV CIRCLE ===
local fovF = Instance.new("Frame")
fovF.Name = "FOVCircle"
fovF.BackgroundTransparency = 1
fovF.AnchorPoint = Vector2.new(0.5,0.5)
fovF.Position = UDim2.new(0.5,0,0.5,0)
fovF.Size = UDim2.new(0,240,0,240)
fovF.Visible = false
fovF.Parent = sg
Instance.new("UICorner", fovF).CornerRadius = UDim.new(1,0)
local fovStk = Instance.new("UIStroke")
fovStk.Color = Color3.fromRGB(220,70,70); fovStk.Thickness = 1.5; fovStk.Transparency = 0.2
fovStk.Parent = fovF
getgenv().KYS_MobileGui.FOVFrame = fovF; getgenv().KYS_MobileGui.FOVStroke = fovStk
-- === AIMBOT BUTTON (ScreenGui terpisah agar AlwaysOnTop) ===
local aimSG = Instance.new("ScreenGui")
aimSG.Name = "KYS_AimBtn"
aimSG.ResetOnSpawn = false
aimSG.IgnoreGuiInset = true
aimSG.ZIndexBehavior = Enum.ZIndexBehavior.AlwaysOnTop
aimSG.Parent = pg
local btn = Instance.new("TextButton")
btn.Name = "AimHold"
btn.Size = UDim2.new(0,75,0,75)
btn.Position = UDim2.new(1,-95,1,-170)
btn.BackgroundColor3 = Color3.fromRGB(200,55,55)
btn.BackgroundTransparency = 0.2
btn.Text = "🎯\nAIM"
btn.TextColor3 = Color3.new(1,1,1)
btn.TextSize = 14
btn.Font = Enum.Font.GothamBold
btn.Visible = false
btn.ZIndex = 20
btn.Parent = aimSG
Instance.new("UICorner", btn).CornerRadius = UDim.new(1,0)
local aStk = Instance.new("UIStroke")
aStk.Color = Color3.fromRGB(255,100,100); aStk.Thickness = 2; aStk.Parent = btn
btn.InputBegan:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.Touch then
State.AimHolding = true
btn.BackgroundColor3 = Color3.fromRGB(50,200,80)
aStk.Color = Color3.fromRGB(50,230,80)
end
end)
btn.InputEnded:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.Touch then
State.AimHolding = false; State.AimTarget = nil
btn.BackgroundColor3 = Color3.fromRGB(200,55,55)
aStk.Color = Color3.fromRGB(255,100,100)
end
end)
getgenv().KYS_MobileGui.AimBtn = btn
end
-- =====================================================
-- SPEAR AIMBOT MOBILE FLOATING BUTTON
-- =====================================================
SpearBtnData = {
UI = nil,
Button = nil,
Active = true,
DragLocked = false,
Dragging = false,
DragStart = nil,
DragStartPos = nil,
ManualTarget = nil, -- Player yang dipilih manual lewat panah, nil = auto (terdekat)
TargetIndex = 0,
TargetLabel = nil, -- label kecil nampilin nama target / "AUTO"
LeftArrow = nil,
RightArrow = nil,
}
function setupSpearAimbotBtn()
if SpearBtnData.UI then pcall(function() SpearBtnData.UI:Destroy() end) end
local player = game:GetService("Players").LocalPlayer
local pg = player:WaitForChild("PlayerGui")
SpearBtnData.UI = Instance.new("ScreenGui")
SpearBtnData.UI.Name = "SpearAimbotUI"
SpearBtnData.UI.ResetOnSpawn = false
SpearBtnData.UI.IgnoreGuiInset = true
SpearBtnData.UI.Parent = pg
-- Main toggle button
SpearBtnData.Button = Instance.new("TextButton")
SpearBtnData.Button.Name = "SpearAimbotButton"
SpearBtnData.Button.Size = UDim2.new(0, 65, 0, 65)
SpearBtnData.Button.Position = UDim2.new(0.15, 0, 0.75, 0)
SpearBtnData.Button.AnchorPoint = Vector2.new(0.5, 0.5)
SpearBtnData.Button.BackgroundColor3 = Color3.fromRGB(30, 10, 10)
SpearBtnData.Button.BackgroundTransparency = 0.15
SpearBtnData.Button.AutoButtonColor = true
SpearBtnData.Button.Text = "SPEAR\nAIM"
SpearBtnData.Button.TextColor3 = Color3.fromRGB(255, 100, 100)
SpearBtnData.Button.TextSize = 11
SpearBtnData.Button.Font = Enum.Font.GothamBold
SpearBtnData.Button.Visible = false
SpearBtnData.Button.ZIndex = 10
SpearBtnData.Button.Parent = SpearBtnData.UI
Instance.new("UICorner", SpearBtnData.Button).CornerRadius = UDim.new(1, 0)
local spearStk = Instance.new("UIStroke", SpearBtnData.Button)
spearStk.Color = Color3.fromRGB(255, 80, 80)
spearStk.Thickness = 2
spearStk.Transparency = 0.2
-- Lock/Unlock drag button (small, top-right corner)
local lockBtn = Instance.new("TextButton")
lockBtn.Name = "LockDrag"
lockBtn.Size = UDim2.new(0, 22, 0, 22)
lockBtn.Position = UDim2.new(1, -5, 0, -5)
lockBtn.AnchorPoint = Vector2.new(1, 0)
lockBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
lockBtn.BackgroundTransparency = 0.3
lockBtn.Text = "L"
lockBtn.TextSize = 10
lockBtn.Font = Enum.Font.GothamBold
lockBtn.TextColor3 = Color3.new(1, 1, 1)
lockBtn.ZIndex = 11
lockBtn.Parent = SpearBtnData.Button
Instance.new("UICorner", lockBtn).CornerRadius = UDim.new(1, 0)
lockBtn.MouseButton1Click:Connect(function()
SpearBtnData.DragLocked = not SpearBtnData.DragLocked
lockBtn.Text = SpearBtnData.DragLocked and "X" or "L"
lockBtn.BackgroundColor3 = SpearBtnData.DragLocked and Color3.fromRGB(200, 50, 50) or Color3.fromRGB(60, 60, 60)
end)
-- Target label (nampilin nama target aktif / "AUTO"), muncul di atas tombol utama
local targetLabel = Instance.new("TextLabel")
targetLabel.Name = "SpearTargetLabel"
targetLabel.Size = UDim2.new(0, 90, 0, 18)
targetLabel.Position = UDim2.new(0.5, 0, 0, -22)
targetLabel.AnchorPoint = Vector2.new(0.5, 0)
targetLabel.BackgroundTransparency = 1
targetLabel.Text = "AUTO"
targetLabel.TextColor3 = Color3.fromRGB(255, 220, 220)
targetLabel.TextSize = 12
targetLabel.Font = Enum.Font.GothamBold
targetLabel.TextTruncate = Enum.TextTruncate.AtEnd
targetLabel.ZIndex = 11
targetLabel.Visible = false
targetLabel.Parent = SpearBtnData.Button
SpearBtnData.TargetLabel = targetLabel
-- Tombol panah kiri: ganti target ke arah sebelumnya di daftar
local leftArrow = Instance.new("TextButton")
leftArrow.Name = "SpearTargetLeft"
leftArrow.Size = UDim2.new(0, 28, 0, 28)
leftArrow.Position = UDim2.new(0, -34, 0.5, 0)
leftArrow.AnchorPoint = Vector2.new(0.5, 0.5)
leftArrow.BackgroundColor3 = Color3.fromRGB(30, 10, 10)
leftArrow.BackgroundTransparency = 0.15
leftArrow.Text = "<"
leftArrow.TextColor3 = Color3.fromRGB(255, 150, 150)
leftArrow.TextSize = 16
leftArrow.Font = Enum.Font.GothamBold
leftArrow.ZIndex = 10
leftArrow.Parent = SpearBtnData.Button
Instance.new("UICorner", leftArrow).CornerRadius = UDim.new(1, 0)
local leftStk = Instance.new("UIStroke", leftArrow)
leftStk.Color = Color3.fromRGB(255, 80, 80)
leftStk.Thickness = 1.5
leftStk.Transparency = 0.3
SpearBtnData.LeftArrow = leftArrow
leftArrow.MouseButton1Click:Connect(function()
pcall(CycleSpearTarget, -1)
end)
-- Tombol panah kanan: ganti target ke arah berikutnya di daftar
local rightArrow = Instance.new("TextButton")
rightArrow.Name = "SpearTargetRight"
rightArrow.Size = UDim2.new(0, 28, 0, 28)
rightArrow.Position = UDim2.new(1, 34, 0.5, 0)
rightArrow.AnchorPoint = Vector2.new(0.5, 0.5)
rightArrow.BackgroundColor3 = Color3.fromRGB(30, 10, 10)
rightArrow.BackgroundTransparency = 0.15
rightArrow.Text = ">"
rightArrow.TextColor3 = Color3.fromRGB(255, 150, 150)
rightArrow.TextSize = 16
rightArrow.Font = Enum.Font.GothamBold
rightArrow.ZIndex = 10
rightArrow.Parent = SpearBtnData.Button
Instance.new("UICorner", rightArrow).CornerRadius = UDim.new(1, 0)
local rightStk = Instance.new("UIStroke", rightArrow)
rightStk.Color = Color3.fromRGB(255, 80, 80)
rightStk.Thickness = 1.5
rightStk.Transparency = 0.3
SpearBtnData.RightArrow = rightArrow
rightArrow.MouseButton1Click:Connect(function()
pcall(CycleSpearTarget, 1)
end)
-- Drag logic
SpearBtnData.Button.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
if SpearBtnData.DragLocked then return end
SpearBtnData.Dragging = true
SpearBtnData.DragStart = input.Position
SpearBtnData.DragStartPos = SpearBtnData.Button.Position
end
end)
game:GetService("UserInputService").InputChanged:Connect(function(input)
if SpearBtnData.Dragging and not SpearBtnData.DragLocked and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - SpearBtnData.DragStart
SpearBtnData.Button.Position = UDim2.new(
SpearBtnData.DragStartPos.X.Scale, SpearBtnData.DragStartPos.X.Offset + delta.X,
SpearBtnData.DragStartPos.Y.Scale, SpearBtnData.DragStartPos.Y.Offset + delta.Y
)
end
end)
SpearBtnData.Button.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
SpearBtnData.Dragging = false
end
end)
-- Toggle Spear Aimbot function on/off (GUI stays visible)
SpearBtnData.Button.MouseButton1Click:Connect(function()
SpearBtnData.Active = not SpearBtnData.Active
if SpearBtnData.Active then
SpearBtnData.Button.BackgroundColor3 = Color3.fromRGB(10, 40, 10)
SpearBtnData.Button.TextColor3 = Color3.fromRGB(80, 255, 120)
spearStk.Color = Color3.fromRGB(80, 255, 120)
pcall(VD_Notify, "Spear Aimbot", "Spear Aimbot AKTIF!", 3)
else
SpearBtnData.Button.BackgroundColor3 = Color3.fromRGB(30, 10, 10)
SpearBtnData.Button.TextColor3 = Color3.fromRGB(255, 100, 100)
spearStk.Color = Color3.fromRGB(255, 80, 80)
pcall(VD_Notify, "Spear Aimbot", "Spear Aimbot NONAKTIF", 3)
end
end)
print("[KysHub] Spear Aimbot Button created successfully")
end
task.spawn(function()
task.wait(3)
setupSpearAimbotBtn()
end)
function UpdateMobileFOV()
if not getgenv().KYS_MobileGui.FOVFrame then return end
if VD.AIM_Enabled and VD.AIM_ShowFOV then
local r = (VD.AIM_FOV or 120)
getgenv().KYS_MobileGui.FOVFrame.Size = UDim2.new(0, r*2, 0, r*2)
getgenv().KYS_MobileGui.FOVStroke.Color = State.AimTarget and Color3.fromRGB(90,220,120) or Color3.fromRGB(220,70,70)
getgenv().KYS_MobileGui.FOVFrame.Visible = true
else
getgenv().KYS_MobileGui.FOVFrame.Visible = false
end
end
task.spawn(function()
task.wait(2)
pcall(CreateMobileUI)
end)
-- =====================================================
-- RENDER LOOP: PC (RenderStepped, pakai Drawing)
-- =====================================================
if DrawingAvailable then
RunService.RenderStepped:Connect(OnRenderStep)
end
RunService.RenderStepped:Connect(function()
pcall(VD_RunCrosshairLoop)
end)
-- =====================================================
-- HEARTBEAT UNIVERSAL: Berjalan di PC & Mobile
-- =====================================================
RunService.Heartbeat:Connect(function(deltaTime)
if VD.Destroyed then return end
local cam = workspace.CurrentCamera
if not cam then return end
if not DrawingAvailable and (not getgenv().KYS_MobileGui.FOVFrame or not getgenv().KYS_MobileGui.FOVFrame.Parent) then
pcall(CreateMobileUI)
end
if not DrawingAvailable then
UpdateCameraFOV()
UpdateThirdPerson()
UpdateShiftLock()
pcall(UpdateSpearAim)
end
if not DrawingAvailable and VD.AIM_Enabled and State.AimHolding then
local sc = cam.ViewportSize
pcall(function() Aimbot.Update(cam, sc, Vector2.new(sc.X/2, sc.Y/2)) end)
end
if not DrawingAvailable then
if getgenv().KYS_MobileGui.AimBtn then getgenv().KYS_MobileGui.AimBtn.Visible = VD.AIM_Enabled end
pcall(UpdateMobileFOV)
end
-- Spear Aimbot button: always update (works on all executors)
if SpearBtnData and SpearBtnData.Button then
local spearVisible = (VD.SPEAR_Aimbot and GetRole() == "Killer")
SpearBtnData.Button.Visible = spearVisible
if spearVisible then pcall(UpdateSpearTargetLabel) end
end
pcall(UpdateRadar)
pcall(VD_RunAntiKnock)
pcall(VD_UpdateSurvivorWarnings)
pcall(VD_UpdateBypassGate)
pcall(VD_UpdateInfiniteLunge)
pcall(VD_UpdateWeatherAnchor)
pcall(VD_UpdateInvisibleNotVisual)
pcall(VD_UpdateMoonwalk, deltaTime)
pcall(VD_UpdateRemovePalletwrong)
end)
-- =====================================================
getgenv().KYS_SyncLoadedFeatures = function()
-- Sync Killer Modifiers
if type(SetupAntiBlind) == "function" then pcall(SetupAntiBlind) end
if type(SetupNoPalletStun) == "function" then pcall(SetupNoPalletStun) end
if type(VD_UpdateCrosshair) == "function" then pcall(VD_UpdateCrosshair) end
-- Sync Kyst Killer Display
if VD.VIS_KystKiller then
pcall(StartKystKiller)
else
pcall(StopKystKiller)
end
-- Sync Spectator Counter
if VD.VIS_SpectatorCounter then
pcall(StartSpectatorCounter)
else
pcall(StopSpectatorCounter)
end
-- Sync Killer Perks Display
if VD.VIS_KillerPerks then
pcall(StartKillerPerksDisplay)
else
pcall(StopKillerPerksDisplay)
end
-- Sync Predict Map
if VD.VIS_PredictMap then
pcall(StartPredictMap)
else
pcall(StopPredictMap)
end
-- Sync Hide Survivor Icon
if getgenv().KYS_SetHideSurvivorIcon then
pcall(getgenv().KYS_SetHideSurvivorIcon, VD.VIS_HideSurvivorIcon)
end
-- Sync Ping & FPS Display
if getgenv().KYS_SetShowPingFPS then
pcall(getgenv().KYS_SetShowPingFPS, VD.VIS_ShowPingFPS)
end
-- Sync Hook Counter
if getgenv().KYS_SetShowHookCounter then
pcall(getgenv().KYS_SetShowHookCounter, VD.VIS_ShowHookCounter)
end
-- Sync Twist of Fate silent aim
if getgenv().KYS_SetToFSilentAim then
pcall(getgenv().KYS_SetToFSilentAim, VD.TOF_SilentAim)
end
-- Sync Flashlight silent aim
if getgenv().KYS_SetFlashlightSilentAim then
pcall(getgenv().KYS_SetFlashlightSilentAim, VD.FLASH_SilentAim)
end
-- Sync Moonwalk external button
if getgenv().VD_SetMoonwalkButtonVisible then
pcall(getgenv().VD_SetMoonwalkButtonVisible, VD.MoonwalkButton)
end
-- Sync Hidden Cooldown Bypass
if VD.KILLER_BypassLeap then
pcall(KYS_StartHiddenCooldownBypass)
end
end
;(function()
local function readConfigElementValue(flagName)
local elem = Window and Window.ConfigElements and Window.ConfigElements[flagName]
if not elem then return nil end
local ok, value = pcall(function()
if type(elem.Get) == "function" then return elem:Get() end
if type(elem.GetValue) == "function" then return elem:GetValue() end
if elem.Value ~= nil then return elem.Value end
if elem.CurrentValue ~= nil then return elem.CurrentValue end
if elem.State ~= nil then return elem.State end
if elem.Enabled ~= nil then return elem.Enabled end
if elem.Default ~= nil then return elem.Default end
if type(elem.Config) == "table" then
if elem.Config.Value ~= nil then return elem.Config.Value end
if elem.Config.Default ~= nil then return elem.Config.Default end
end
end)
if ok then return value end
return nil
end
getgenv().KYS_SyncUILibraryConfigRuntime = function()
local tofValue = readConfigElementValue("Silent Aim Twist Of Fate")
if type(tofValue) == "boolean" and tofValue ~= VD.TOF_SilentAim and getgenv().KYS_SetToFSilentAim then
pcall(getgenv().KYS_SetToFSilentAim, tofValue)
elseif type(tofValue) == "boolean" then
VD.TOF_SilentAim = tofValue
if tofValue and getgenv().KYS_SetToFSilentAim then
pcall(getgenv().KYS_SetToFSilentAim, true)
end
end
local flashValue = readConfigElementValue("Silent Aim Flashlight")
if type(flashValue) == "boolean" and flashValue ~= VD.FLASH_SilentAim and getgenv().KYS_SetFlashlightSilentAim then
pcall(getgenv().KYS_SetFlashlightSilentAim, flashValue)
elseif type(flashValue) == "boolean" then
VD.FLASH_SilentAim = flashValue
if flashValue and getgenv().KYS_SetFlashlightSilentAim then
pcall(getgenv().KYS_SetFlashlightSilentAim, true)
end
end
end
task.spawn(function()
local lastToF, lastFlash = nil, nil
while getgenv().VD and not getgenv().VD.Destroyed do
local tofValue = readConfigElementValue("Silent Aim Twist Of Fate")
local flashValue = readConfigElementValue("Silent Aim Flashlight")
if type(tofValue) == "boolean" and tofValue ~= lastToF then
lastToF = tofValue
if getgenv().KYS_SetToFSilentAim then
pcall(getgenv().KYS_SetToFSilentAim, tofValue)
else
VD.TOF_SilentAim = tofValue
end
end
if type(flashValue) == "boolean" and flashValue ~= lastFlash then
lastFlash = flashValue
if getgenv().KYS_SetFlashlightSilentAim then
pcall(getgenv().KYS_SetFlashlightSilentAim, flashValue)
else
VD.FLASH_SilentAim = flashValue
end
end
task.wait(1)
end
end)
end)();
end
__KysHub_Init_Main__()
--cracked by ashy3447