
Keyless

-- Kasumi's Case Rolling Controller - Case Rolling RNG Only
-- Game validation first
local CASE_ROLLING_RNG_ID = 128886701132186
if game.PlaceId ~= CASE_ROLLING_RNG_ID then
game:GetService("StarterGui"):SetCore("SendNotification", {
Title = "Wrong Game!";
Text = "This script only works in Case Rolling RNG";
Duration = 5;
})
return
end
local WindUI = loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua"))()
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local TeleportService = game:GetService("TeleportService")
local NetworkClient = game:GetService("NetworkClient")
local localPlayer = Players.LocalPlayer
-- Script Version
local SCRIPT_VERSION = "v1.7"
-- ✅ FIXED: Configuration system with ALL toggles (like Plants vs Brainrot)
local CONFIG_FILE = "Kasumi/KasumiHub_Config.json"
local SETTINGS_FILE = "Kasumi/KasumiHub_Settings.json"
local defaultConfig = {
selectedCase = "Weapon Case",
openInterval = 1000,
animationSpeed = 1000,
theme = "Dark",
obbyInterval = 3000,
antiAFKEnabled = false,
autoReconnectEnabled = false,
autoApplyAnimSpeed = true,
autoTeleportZone9 = false,
autoOpenEnabled = false,
obbyEnabled = false
}
local defaultSettings = {
autoLoadConfig = "None",
autoLoadEnabled = false
}
local currentConfig = {}
local currentSettings = {}
-- Variables
local autoOpenEnabled = false
local selectedCase = defaultConfig.selectedCase
local openAmount = 1
local openInterval = defaultConfig.openInterval
local caseDropdown = nil
local animationSpeedInput = nil
local intervalInput = nil
local themeDropdown = nil
local darkModeToggle = nil
local configFile = nil
local canChangeTheme = true
local canChangeDropdown = true
local Window = nil
local autoLoadDropdown = nil
local autoLoadToggle = nil
local ConfigNameInput = nil
-- Auto Farm variables
local obbyEnabled = false
local obbyInterval = 3000
local obbyIntervalInput = nil
-- UI References for keybinds
local autoOpenToggle = nil
local autoFarmToggle = nil
-- Anti-AFK & Auto-Reconnect
local antiAFKEnabled = false
local autoReconnectEnabled = false
local antiAFKToggle = nil
local autoReconnectToggle = nil
local idledConnection = nil
local antiAFKLoop = nil
-- Auto-reconnect variables
local reconnectAttempts = 0
local MAX_RECONNECT_ATTEMPTS = 30
local RECONNECT_INTERVAL = 6
local lastDisconnectTime = 0
local lastPingTime = tick()
local consecutiveTimeouts = 0
-- Auto-apply animation speed
local autoApplyAnimSpeed = true
local autoApplyAnimSpeedToggle = nil
local lastAppliedAnimSpeed = nil
-- Zone 9 Auto-Teleport
local autoTeleportZone9 = false
local autoTeleportZone9Toggle = nil
local zone9Coordinates = Vector3.new(-237, 5, 2376)
-- Obby coordinates
local obbyCoordinates = {
x = 160,
y = 564,
z = -845
}
local availableCases = {
"2013 Case", "2013 Winter Case", "2014 Summer Case", "2015 Cobblestone Collection",
"Chroma Case", "Clutch Case", "Dreams & Nightmares Case", "Fever Case",
"Fracture Case", "Free Case", "Gamma 2 Case", "Huntsman Weapon Case",
"Katowice 2014 Challengers Capsule", "Katowice 2014 Legends Capsule",
"Operation Bravo Case", "Operation Breakout Case", "Operation Hydra Case",
"Prisma 2 Case", "Recoil Case", "Revolver Case", "St. Marc Collection",
"VIP Case", "Weapon Case", "Weapon Case 3"
}
-- ====== CORE FUNCTIONS FIRST (MUST BE DEFINED BEFORE LOOPS) ======
-- Get case open slots
local function getCaseOpenSlots()
local possibleLocations = {
localPlayer:FindFirstChild("SettingsFolder"),
localPlayer:FindFirstChild("Settings"),
localPlayer:FindFirstChild("PlayerSettings")
}
local possibleNames = {
"Case Open Slots",
"CaseOpenSlots",
"OpenSlots",
"CaseSlots"
}
for _, location in pairs(possibleLocations) do
if location then
for _, name in pairs(possibleNames) do
local slots = location:FindFirstChild(name)
if slots and slots:IsA("NumberValue") then
return slots.Value
end
end
end
end
return 1
end
-- Open cases
local function openCase(caseName, amount)
local success = false
pcall(function()
local remotes = ReplicatedStorage:WaitForChild("Remotes", 5)
if remotes then
local mainEvent = remotes:WaitForChild("MainEvent", 5)
if mainEvent then
mainEvent:FireServer("OpenCase", caseName, amount)
success = true
end
end
end)
return success
end
-- Core obby teleport function
local function teleportToObby()
if localPlayer.Character and localPlayer.Character:FindFirstChild("HumanoidRootPart") then
localPlayer.Character.HumanoidRootPart.CFrame = CFrame.new(obbyCoordinates.x, obbyCoordinates.y + 5, obbyCoordinates.z)
return true
end
return false
end
-- Simulate spacebar jump function
local function spamJumpKeypress()
task.spawn(function()
while obbyEnabled do
local success = pcall(function()
keypress(0x20)
task.wait(0.05)
keyrelease(0x20)
end)
if not success then
if localPlayer.Character and localPlayer.Character:FindFirstChild("Humanoid") then
local humanoid = localPlayer.Character.Humanoid
if humanoid.FloorMaterial ~= Enum.Material.Air then
humanoid.Jump = true
end
end
end
task.wait(0.5)
end
end)
end
-- ====== ZONE 9 TELEPORT FUNCTION ======
local function teleportToZone9()
if localPlayer.Character and localPlayer.Character:FindFirstChild("HumanoidRootPart") then
localPlayer.Character.HumanoidRootPart.CFrame = CFrame.new(zone9Coordinates)
return true
end
return false
end
-- ====== IMPROVED ANTI-AFK SYSTEM ======
local function startAntiAFK()
local VirtualUser = game:GetService("VirtualUser")
if not idledConnection then
idledConnection = localPlayer.Idled:Connect(function()
if antiAFKEnabled then
VirtualUser:CaptureController()
VirtualUser:ClickButton2(Vector2.new())
print("🛡️ Anti-AFK: Prevented idle kick")
end
end)
end
if not antiAFKLoop then
antiAFKLoop = task.spawn(function()
while true do
if antiAFKEnabled then
VirtualUser:CaptureController()
VirtualUser:Button1Down(Vector2.new(0, 0))
task.wait(0.1)
VirtualUser:Button1Up(Vector2.new(0, 0))
end
task.wait(600)
end
end)
end
end
-- ====== IMPROVED AUTO-RECONNECT SYSTEM ======
local function setupAutoReconnect()
print("🌐 Initializing 3-minute auto-reconnect with network monitoring...")
pcall(function()
local RobloxPromptGui = game:GetService("CoreGui"):FindFirstChild("RobloxPromptGui")
if RobloxPromptGui then
local promptOverlay = RobloxPromptGui:FindFirstChild("promptOverlay")
if promptOverlay then
promptOverlay.ChildAdded:Connect(function(child)
if child.Name == "ErrorPrompt" and autoReconnectEnabled then
task.wait(0.5)
local errorMessage = child:FindFirstChild("MessageArea")
if errorMessage then
local messageText = errorMessage:FindFirstChild("ErrorMessage")
if messageText then
local text = messageText.Text:lower()
if string.find(text, "disconnect") or
string.find(text, "connection") or
string.find(text, "lost") or
string.find(text, "error") or
string.find(text, "kicked") or
string.find(text, "unable") or
string.find(text, "timeout") or
string.find(text, "network") or
string.find(text, "failed") or
string.find(text, "id=17") then
reconnectAttempts = reconnectAttempts + 1
if reconnectAttempts <= MAX_RECONNECT_ATTEMPTS then
local timeRemaining = (MAX_RECONNECT_ATTEMPTS - reconnectAttempts) * RECONNECT_INTERVAL
print(string.format("🔄 Network issue - reconnecting (attempt %d/%d, %ds remaining)",
reconnectAttempts, MAX_RECONNECT_ATTEMPTS, timeRemaining))
task.wait(RECONNECT_INTERVAL)
local success = pcall(function()
TeleportService:TeleportToPlaceInstance(game.PlaceId, game.JobId, localPlayer)
end)
if not success then
pcall(function()
TeleportService:Teleport(game.PlaceId, localPlayer)
end)
end
else
print("❌ Max reconnect attempts reached (3 minutes elapsed)")
end
end
end
end
end
end)
end
end
end)
pcall(function()
NetworkClient.ChildRemoved:Connect(function()
if autoReconnectEnabled then
local currentTime = tick()
if currentTime - lastDisconnectTime > 5 then
lastDisconnectTime = currentTime
reconnectAttempts = reconnectAttempts + 1
if reconnectAttempts <= MAX_RECONNECT_ATTEMPTS then
local timeRemaining = (MAX_RECONNECT_ATTEMPTS - reconnectAttempts) * RECONNECT_INTERVAL
print(string.format("🔄 NetworkClient disconnect (attempt %d/%d, %ds left)",
reconnectAttempts, MAX_RECONNECT_ATTEMPTS, timeRemaining))
task.wait(RECONNECT_INTERVAL)
pcall(function()
TeleportService:Teleport(game.PlaceId, localPlayer)
end)
end
end
end
end)
end)
task.spawn(function()
while true do
task.wait(8)
if autoReconnectEnabled then
local pingStart = tick()
local pingSuccess = pcall(function()
local test = game:GetService("Players"):GetPlayers()
return test ~= nil
end)
local pingTime = tick() - pingStart
if not pingSuccess or pingTime > 4 then
consecutiveTimeouts = consecutiveTimeouts + 1
if consecutiveTimeouts >= 4 then
print("🔴 Connection lost - poor network quality")
reconnectAttempts = reconnectAttempts + 1
if reconnectAttempts <= MAX_RECONNECT_ATTEMPTS then
task.wait(RECONNECT_INTERVAL)
pcall(function()
TeleportService:Teleport(game.PlaceId, localPlayer)
end)
end
consecutiveTimeouts = 0
end
else
consecutiveTimeouts = 0
end
lastPingTime = tick()
end
end
end)
print("✅ 3-minute auto-reconnect initialized (30 attempts × 6 seconds)")
end
-- ✅ CRITICAL: Auto-start loop functions (DEFINED AFTER CORE FUNCTIONS)
local function startAutoOpenLoop()
task.spawn(function()
print("🔄 Starting Auto Open Cases loop...")
while autoOpenEnabled do
local success = openCase(selectedCase, openAmount)
if not success then
task.wait(2)
end
task.wait(openInterval / 1000)
end
end)
end
local function startAutoFarmLoop()
task.spawn(function()
print("🔄 Starting Auto Farm loop...")
while obbyEnabled do
local success = teleportToObby()
if not success then
task.wait(2)
end
task.wait(obbyInterval / 1000)
end
end)
spamJumpKeypress()
end
-- ====== KEYBIND SYSTEM ======
local function setupKeybinds()
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
local isCtrlPressed = UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) or UserInputService:IsKeyDown(Enum.KeyCode.RightControl)
if isCtrlPressed then
if input.KeyCode == Enum.KeyCode.R then
autoOpenEnabled = not autoOpenEnabled
if autoOpenToggle then
pcall(function()
if autoOpenToggle.Set then
autoOpenToggle:Set(autoOpenEnabled)
end
end)
end
if autoOpenEnabled then
startAutoOpenLoop()
end
elseif input.KeyCode == Enum.KeyCode.F then
obbyEnabled = not obbyEnabled
if autoFarmToggle then
pcall(function()
if autoFarmToggle.Set then
autoFarmToggle:Set(obbyEnabled)
end
end)
end
if obbyEnabled then
startAutoFarmLoop()
end
end
end
end)
end
-- Apply obby interval function
local function applyObbyInterval()
if obbyIntervalInput then
local value = obbyIntervalInput.Get and obbyIntervalInput:Get() or obbyIntervalInput.Value or "3000"
local num = tonumber(value)
if num and num > 0 then
obbyInterval = num
return true
end
end
return false
end
-- Settings management
local function saveSettings()
local settings = {
autoLoadConfig = currentSettings.autoLoadConfig or defaultSettings.autoLoadConfig,
autoLoadEnabled = currentSettings.autoLoadEnabled or defaultSettings.autoLoadEnabled
}
if not isfolder("Kasumi") then
makefolder("Kasumi")
end
local success = pcall(function()
writefile(SETTINGS_FILE, game:GetService("HttpService"):JSONEncode(settings))
end)
return success
end
local function loadSettings()
local success, result = pcall(function()
if isfile(SETTINGS_FILE) then
local data = readfile(SETTINGS_FILE)
return game:GetService("HttpService"):JSONDecode(data)
end
return nil
end)
if success and result then
currentSettings = result
else
currentSettings = table.clone(defaultSettings)
saveSettings()
end
return currentSettings
end
-- Get available config files
local function getAvailableConfigs()
local configs = {"None"}
pcall(function()
if isfolder("Kasumi") then
local files = listfiles("Kasumi")
for _, file in pairs(files) do
if file:match("%.json$") and not file:match("Settings") then
local fileName = file:match("Kasumi/(.+)%.json$") or file:match("([^/\\]+)%.json$")
if fileName and fileName ~= "KasumiHub_Settings" then
if not table.find(configs, fileName) then
table.insert(configs, fileName)
end
end
end
end
end
end)
return configs
end
-- Save config
local function saveConfig(customName)
if not isfolder("Kasumi") then
makefolder("Kasumi")
end
local fileName = customName and ("Kasumi/" .. customName .. ".json") or CONFIG_FILE
local animSpeed = animationSpeedInput and (tonumber(animationSpeedInput.Get and animationSpeedInput:Get() or animationSpeedInput.Value) or 1000) or 1000
local interval = intervalInput and (tonumber(intervalInput.Get and intervalInput:Get() or intervalInput.Value) or 1000) or 1000
local obbyInt = obbyIntervalInput and (tonumber(obbyIntervalInput.Get and obbyIntervalInput:Get() or obbyIntervalInput.Value) or 3000) or 3000
currentConfig = {
selectedCase = selectedCase,
openInterval = interval,
animationSpeed = animSpeed,
theme = WindUI:GetCurrentTheme() or "Dark",
obbyInterval = obbyInt,
antiAFKEnabled = antiAFKEnabled,
autoReconnectEnabled = autoReconnectEnabled,
autoApplyAnimSpeed = autoApplyAnimSpeed,
autoTeleportZone9 = autoTeleportZone9,
autoOpenEnabled = autoOpenEnabled,
obbyEnabled = obbyEnabled
}
local success = pcall(function()
writefile(fileName, game:GetService("HttpService"):JSONEncode(currentConfig))
end)
if success then
WindUI:Notify({
Title = "Config Saved",
Content = "Configuration saved as: " .. (customName or "KasumiHub_Config"),
Duration = 3
})
end
return success
end
-- Load config
local function loadConfig(configName)
configName = configName or "KasumiHub_Config"
local filesToTry = {
"Kasumi/" .. configName .. ".json",
configName .. ".json",
configName == "KasumiHub_Config" and CONFIG_FILE or nil
}
local success, result = false, nil
for _, file in pairs(filesToTry) do
if file and isfile(file) then
success, result = pcall(function()
local data = readfile(file)
return game:GetService("HttpService"):JSONDecode(data)
end)
if success and result then
break
end
end
end
if success and result then
currentConfig = result
selectedCase = currentConfig.selectedCase or defaultConfig.selectedCase
openInterval = currentConfig.openInterval or defaultConfig.openInterval
obbyInterval = currentConfig.obbyInterval or defaultConfig.obbyInterval
antiAFKEnabled = currentConfig.antiAFKEnabled or false
autoReconnectEnabled = currentConfig.autoReconnectEnabled or false
autoApplyAnimSpeed = currentConfig.autoApplyAnimSpeed ~= nil and currentConfig.autoApplyAnimSpeed or true
autoTeleportZone9 = currentConfig.autoTeleportZone9 or false
autoOpenEnabled = currentConfig.autoOpenEnabled or false
obbyEnabled = currentConfig.obbyEnabled or false
return true
else
currentConfig = table.clone(defaultConfig)
selectedCase = defaultConfig.selectedCase
openInterval = defaultConfig.openInterval
obbyInterval = defaultConfig.obbyInterval
antiAFKEnabled = false
autoReconnectEnabled = false
autoApplyAnimSpeed = true
autoTeleportZone9 = false
autoOpenEnabled = false
obbyEnabled = false
return false
end
end
-- Update case dropdown
local function updateCaseDropdownProperly()
if caseDropdown then
task.spawn(function()
if not table.find(availableCases, selectedCase) then
selectedCase = availableCases[1] or defaultConfig.selectedCase
end
task.wait(0.3)
pcall(function()
if caseDropdown.Set then
caseDropdown:Set(selectedCase)
end
if caseDropdown.Value ~= nil then
caseDropdown.Value = selectedCase
end
if Window and Window.Flags and Window.Flags.CaseSelection ~= nil then
Window.Flags.CaseSelection = selectedCase
end
task.wait(0.1)
if caseDropdown.Refresh then
caseDropdown:Refresh(availableCases, selectedCase)
end
end)
end)
end
end
-- Update UI toggles
local function updateAllUI()
task.spawn(function()
task.wait(0.3)
updateCaseDropdownProperly()
if intervalInput and intervalInput.Set then
pcall(function() intervalInput:Set(tostring(openInterval)) end)
end
if obbyIntervalInput and obbyIntervalInput.Set then
pcall(function() obbyIntervalInput:Set(tostring(obbyInterval)) end)
end
if animationSpeedInput and animationSpeedInput.Set and currentConfig.animationSpeed then
pcall(function() animationSpeedInput:Set(tostring(currentConfig.animationSpeed)) end)
end
if currentConfig.theme then
pcall(function()
WindUI:SetTheme(currentConfig.theme)
if themeDropdown and themeDropdown.Set then
themeDropdown:Set(currentConfig.theme)
end
if darkModeToggle and darkModeToggle.Set then
darkModeToggle:Set(currentConfig.theme == "Dark")
end
end)
end
if autoOpenToggle then
pcall(function()
autoOpenToggle.Value = autoOpenEnabled
if autoOpenToggle.Set then autoOpenToggle:Set(autoOpenEnabled) end
end)
end
if autoFarmToggle then
pcall(function()
autoFarmToggle.Value = obbyEnabled
if autoFarmToggle.Set then autoFarmToggle:Set(obbyEnabled) end
end)
end
if antiAFKToggle then
pcall(function()
antiAFKToggle.Value = antiAFKEnabled
if antiAFKToggle.Set then antiAFKToggle:Set(antiAFKEnabled) end
end)
end
if autoReconnectToggle then
pcall(function()
autoReconnectToggle.Value = autoReconnectEnabled
if autoReconnectToggle.Set then autoReconnectToggle:Set(autoReconnectEnabled) end
end)
end
if autoApplyAnimSpeedToggle then
pcall(function()
autoApplyAnimSpeedToggle.Value = autoApplyAnimSpeed
if autoApplyAnimSpeedToggle.Set then autoApplyAnimSpeedToggle:Set(autoApplyAnimSpeed) end
end)
end
if autoTeleportZone9Toggle then
pcall(function()
autoTeleportZone9Toggle.Value = autoTeleportZone9
if autoTeleportZone9Toggle.Set then autoTeleportZone9Toggle:Set(autoTeleportZone9) end
end)
end
if autoLoadToggle then
pcall(function()
autoLoadToggle.Value = currentSettings.autoLoadEnabled
if autoLoadToggle.Set then autoLoadToggle:Set(currentSettings.autoLoadEnabled) end
end)
end
end)
end
-- Load config with sync
local function loadConfigWithProperSync(configName)
local success = loadConfig(configName)
if success then
task.spawn(function()
task.wait(0.2)
updateCaseDropdownProperly()
updateAllUI()
end)
return true
end
return false
end
-- Reset to default
local function resetToDefault()
selectedCase = defaultConfig.selectedCase
openInterval = defaultConfig.openInterval
obbyInterval = defaultConfig.obbyInterval
antiAFKEnabled = false
autoReconnectEnabled = false
autoApplyAnimSpeed = true
autoTeleportZone9 = false
autoOpenEnabled = false
obbyEnabled = false
task.spawn(function()
task.wait(0.2)
updateCaseDropdownProperly()
updateAllUI()
end)
WindUI:Notify({
Title = "Reset Complete",
Content = "All settings reset to default values",
Duration = 3
})
end
-- Get available cases from game
local function getAvailableCases()
local cases = {}
local foundFromGame = false
local caseSources = {
ReplicatedStorage:FindFirstChild("Cases"),
ReplicatedStorage:FindFirstChild("CasesFolder"),
ReplicatedStorage:FindFirstChild("Items") and ReplicatedStorage.Items:FindFirstChild("Cases"),
workspace:FindFirstChild("Cases"),
ReplicatedStorage:FindFirstChild("Data") and ReplicatedStorage.Data:FindFirstChild("Cases"),
game:GetService("ServerStorage"):FindFirstChild("Cases")
}
for _, caseSource in pairs(caseSources) do
if caseSource then
pcall(function()
for _, case in pairs(caseSource:GetChildren()) do
if case.Name and case.Name ~= "" and not table.find(cases, case.Name) then
table.insert(cases, case.Name)
end
end
end)
if #cases > 0 then
foundFromGame = true
break
end
end
end
if #cases == 0 then
cases = availableCases
foundFromGame = false
end
return cases, foundFromGame
end
-- Convert input to animation speed
local function inputToAnimationSpeed(input)
if input <= 0 then
return 1
end
return input / 100
end
-- Set animation speed
local function setAnimationSpeed(speed)
local settings = localPlayer:FindFirstChild("SettingsFolder") or localPlayer:FindFirstChild("Settings")
if settings then
local animSpeed = settings:FindFirstChild("Animation Speed")
if animSpeed and animSpeed:IsA("NumberValue") then
animSpeed.Value = speed
return true
end
end
return false
end
-- Apply interval
local function applyInterval()
if intervalInput then
local value = intervalInput.Get and intervalInput:Get() or intervalInput.Value or "1000"
local num = tonumber(value)
if num and num > 0 then
openInterval = num
return true
end
end
return false
end
-- ✅ CRITICAL FIX: Load settings and config BEFORE UI creation
loadSettings()
if currentSettings.autoLoadEnabled and currentSettings.autoLoadConfig ~= "None" then
local configName = currentSettings.autoLoadConfig
local filesToTry = {
"Kasumi/" .. configName .. ".json",
configName .. ".json"
}
for _, file in pairs(filesToTry) do
if file and isfile(file) then
local success, result = pcall(function()
return game:GetService("HttpService"):JSONDecode(readfile(file))
end)
if success and result then
currentConfig = result
selectedCase = currentConfig.selectedCase or defaultConfig.selectedCase
openInterval = currentConfig.openInterval or defaultConfig.openInterval
obbyInterval = currentConfig.obbyInterval or defaultConfig.obbyInterval
antiAFKEnabled = currentConfig.antiAFKEnabled or false
autoReconnectEnabled = currentConfig.autoReconnectEnabled or false
autoApplyAnimSpeed = currentConfig.autoApplyAnimSpeed ~= nil and currentConfig.autoApplyAnimSpeed or true
autoTeleportZone9 = currentConfig.autoTeleportZone9 or false
autoOpenEnabled = currentConfig.autoOpenEnabled or false
obbyEnabled = currentConfig.obbyEnabled or false
-- ✅ CRITICAL: Start systems immediately (FUNCTIONS ARE NOW DEFINED)
if antiAFKEnabled then startAntiAFK() end
if autoReconnectEnabled then setupAutoReconnect() end
if autoOpenEnabled then startAutoOpenLoop() end
if obbyEnabled then startAutoFarmLoop() end
print("✅ Pre-loaded config before UI:", configName)
break
end
end
end
end
-- Set theme
WindUI:SetTheme(currentConfig.theme or defaultConfig.theme)
Window = WindUI:CreateWindow({
Title = "Kasumi Hub",
Icon = "zap",
Author = "@kasumichwan",
Folder = "Kasumi",
Size = UDim2.fromOffset(580, 490),
Theme = currentConfig.theme or defaultConfig.theme,
SideBarWidth = 180,
})
Window:SetToggleKey(Enum.KeyCode.G)
Window:CreateTopbarButton("theme-switcher", "moon", function()
local newTheme = WindUI:GetCurrentTheme() == "Dark" and "Light" or "Dark"
WindUI:SetTheme(newTheme)
if canChangeTheme and darkModeToggle then
darkModeToggle:Set(newTheme == "Dark")
end
if canChangeDropdown and themeDropdown then
themeDropdown:Set(newTheme)
end
end, 990)
Window:EditOpenButton({
Title = "Open Kasumi Hub",
Icon = "zap",
CornerRadius = UDim.new(0,12),
StrokeThickness = 2,
Color = ColorSequence.new(
Color3.fromHex("FF0F7B"),
Color3.fromHex("F89B29")
),
OnlyMobile = true,
Enabled = true,
Draggable = true,
})
-- Create tabs
local InformationTab = Window:Tab({
Title = "Information",
Icon = "info",
Locked = false
})
local AutoOpenTab = Window:Tab({
Title = "Auto Open Cases",
Icon = "package",
Locked = false
})
local AnimationTab = Window:Tab({
Title = "Case Opening Speed",
Icon = "zap",
Locked = false
})
local AutoFarmTab = Window:Tab({
Title = "Auto Farm",
Icon = "dollar-sign",
Locked = false
})
local SettingsTab = Window:Tab({
Title = "Settings",
Icon = "settings",
Locked = false
})
Window:SelectTab(1)
-- Information Tab
InformationTab:Paragraph({
Title = "Case Rolling RNG",
Desc = string.format([[Kasumi Hub %s
Key will auto load and work forever until I changed it so if it ask for key it means I changed it but you can get the key always. (You can share the key to your friends but don't leak it in the public or else I'll change key :<)
FEATURES:
• Auto buy seeds
• Auto buy gears
• Sell all brainrot and Plants (Favorite not included)
• Auto equip your best brainrot and auto collects all money
• Anti-AFK protection (NEW)
• Auto-reconnect on disconnect (NEW)
• Save and load config
• Auto-load your preferred setup on startup
• Multiple theme options for personalization
CONTROLS:
• G = Show/Hide Interface
• Ctrl + B = Toggle Seed Auto-Buy
• Ctrl + N = Toggle Gear Auto-Buy
• Ctrl + E = Toggle Auto Equipment + Auto Collect Money
CHANGELOGS:
v1.1
• Added Anti-AFK system
• Added Auto-reconnect feature
• Improved config save/load
Made for you with love <3]], SCRIPT_VERSION)
})
InformationTab:Button({
Title = "Refresh Game Data",
Icon = "refresh-cw",
Callback = function()
local newCases, fromGame = getAvailableCases()
availableCases = newCases
openAmount = getCaseOpenSlots()
if caseDropdown then
caseDropdown:Refresh(availableCases)
updateCaseDropdownProperly()
end
WindUI:Notify({
Title = "Data Refreshed",
Content = string.format("Cases: %d (%s), Slots: %d",
#availableCases,
fromGame and "from game" or "fallback",
openAmount),
Duration = 4
})
end
})
-- Auto Open Tab
caseDropdown = AutoOpenTab:Dropdown({
Title = "Select Case to Open",
Values = availableCases,
Value = selectedCase,
SearchBarEnabled = true,
MenuWidth = 400,
Flag = "CaseSelection",
Callback = function(value)
selectedCase = value
end
})
intervalInput = AutoOpenTab:Input({
Title = "Opening Interval (ms)",
Desc = "Time between case opening attempts (best: 100ms to 1000ms)",
Value = tostring(openInterval)
})
AutoOpenTab:Button({
Title = "Apply Interval",
Icon = "clock",
Variant = "Secondary",
Callback = function()
applyInterval()
end
})
autoOpenToggle = AutoOpenTab:Toggle({
Title = "Enable Auto Opening",
Desc = "Continuously open selected cases (Ctrl+R to toggle)",
Value = autoOpenEnabled,
Callback = function(enabled)
if enabled ~= autoOpenEnabled then
autoOpenEnabled = enabled
if enabled then
startAutoOpenLoop()
end
end
end
})
AutoOpenTab:Button({
Title = "Open Cases Once",
Icon = "package",
Callback = function()
local success = openCase(selectedCase, openAmount)
if success then
WindUI:Notify({
Title = "Manual Opening",
Content = string.format("Opened %d x %s", openAmount, selectedCase),
Duration = 2
})
end
end
})
-- Animation Speed Tab
animationSpeedInput = AnimationTab:Input({
Title = "Case Opening Animation Speed",
Desc = "Auto-applies as you type! (best: 1000 to 10000+)",
Value = tostring(currentConfig.animationSpeed or defaultConfig.animationSpeed),
Callback = function(value)
if autoApplyAnimSpeed then
local inputValue = tonumber(value)
if inputValue and inputValue > 0 and inputValue ~= lastAppliedAnimSpeed then
task.spawn(function()
task.wait(0.5)
local currentValue = animationSpeedInput.Get and animationSpeedInput:Get() or value
local finalValue = tonumber(currentValue)
if finalValue and finalValue > 0 and finalValue == inputValue then
local convertedSpeed = inputToAnimationSpeed(finalValue)
local success = setAnimationSpeed(convertedSpeed)
if success then
lastAppliedAnimSpeed = finalValue
end
end
end)
end
end
end
})
autoApplyAnimSpeedToggle = AnimationTab:Toggle({
Title = "Enable Auto-Apply Speed",
Desc = "Automatically apply animation speed as you type",
Value = autoApplyAnimSpeed,
Callback = function(state)
autoApplyAnimSpeed = state
end
})
AnimationTab:Button({
Title = "Apply Speed Manually",
Icon = "check",
Variant = "Primary",
Callback = function()
local value = animationSpeedInput.Get and animationSpeedInput:Get() or animationSpeedInput.Value or "1000"
local inputValue = tonumber(value)
if inputValue and inputValue > 0 then
local convertedSpeed = inputToAnimationSpeed(inputValue)
local success = setAnimationSpeed(convertedSpeed)
if success then
lastAppliedAnimSpeed = inputValue
WindUI:Notify({
Title = "Speed Applied",
Content = "Animation speed set to: " .. inputValue,
Duration = 2
})
else
WindUI:Notify({
Title = "Failed",
Content = "Failed to set animation speed",
Duration = 4
})
end
end
end
})
AnimationTab:Divider()
AnimationTab:Paragraph({
Title = "Recommended Settings",
Desc = [[
• 100 = Normal speed
• 500 = 5x faster
• 1000 = 10x faster
• 10000 = 100x faster
You can set it higher!]]
})
-- Auto Farm Tab
AutoFarmTab:Paragraph({
Title = "Obby Cash Farming",
Desc = [[Automatically complete obbies to earn cash!
This feature will:
• Teleport to obby completion platform
• Automatically collect cash rewards
• Spam jump for better platform detection
Set your interval and enable to start farming.]]
})
obbyIntervalInput = AutoFarmTab:Input({
Title = "Farm Interval (ms)",
Desc = "Time between obby completions (recommended: 3000ms+)",
Value = tostring(obbyInterval)
})
AutoFarmTab:Button({
Title = "Apply Interval",
Icon = "clock",
Variant = "Secondary",
Callback = function()
applyObbyInterval()
end
})
autoFarmToggle = AutoFarmTab:Toggle({
Title = "Enable Auto Farm",
Desc = "Automatically complete obbies with spam jumping (Ctrl+F to toggle)",
Value = obbyEnabled,
Callback = function(enabled)
if enabled ~= obbyEnabled then
obbyEnabled = enabled
if enabled then
startAutoFarmLoop()
end
end
end
})
AutoFarmTab:Button({
Title = "Complete Once",
Icon = "dollar-sign",
Variant = "Primary",
Callback = function()
teleportToObby()
end
})
AutoFarmTab:Divider()
-- Settings Tab
SettingsTab:Paragraph({
Title = "Customize Interface",
Desc = "Personalize your Kasumi Hub experience",
Image = "palette",
ImageSize = 20,
Color = "White"
})
local themes = {}
for themeName, _ in pairs(WindUI:GetThemes()) do
table.insert(themes, themeName)
end
table.sort(themes)
themeDropdown = SettingsTab:Dropdown({
Title = "Select Theme",
Values = themes,
SearchBarEnabled = true,
MenuWidth = 280,
Value = WindUI:GetCurrentTheme(),
Callback = function(theme)
canChangeDropdown = false
WindUI:SetTheme(theme)
canChangeDropdown = true
end
})
darkModeToggle = SettingsTab:Toggle({
Title = "Enable Dark Mode",
Desc = "Use dark color scheme",
Value = WindUI:GetCurrentTheme() == "Dark",
Callback = function(state)
if canChangeTheme then
WindUI:SetTheme(state and "Dark" or "Light")
if canChangeDropdown then
themeDropdown:Set(state and "Dark" or "Light")
end
end
end
})
WindUI:OnThemeChange(function(theme)
canChangeTheme = false
if darkModeToggle then
darkModeToggle:Set(theme == "Dark")
end
canChangeTheme = true
end)
SettingsTab:Divider()
-- Anti-AFK & Auto-Reconnect
SettingsTab:Paragraph({
Title = "Connection & Activity",
Desc = "Manage anti-AFK and auto-reconnect features",
Image = "wifi",
ImageSize = 20,
Color = "White"
})
antiAFKToggle = SettingsTab:Toggle({
Title = "Enable Anti-AFK",
Desc = "Prevents idle kick with improved detection",
Value = antiAFKEnabled,
Callback = function(state)
antiAFKEnabled = state
if antiAFKEnabled then
startAntiAFK()
end
end
})
autoReconnectToggle = SettingsTab:Toggle({
Title = "Enable Auto-Reconnect",
Desc = "6 detection methods - 30 tries, 6s interval = 3min total (IMPROVED)",
Value = autoReconnectEnabled,
Callback = function(state)
autoReconnectEnabled = state
reconnectAttempts = 0
if autoReconnectEnabled then
setupAutoReconnect()
end
end
})
SettingsTab:Divider()
-- Zone 9 Auto-Teleport
SettingsTab:Paragraph({
Title = "Zone 9 Auto-Teleport",
Desc = "Automatically teleport to Zone 9 when script loads",
Image = "map-pin",
ImageSize = 20,
Color = "White"
})
autoTeleportZone9Toggle = SettingsTab:Toggle({
Title = "Enable Zone 9 Teleport",
Desc = "Teleports to Zone 9 twice on startup (3s delay, then 1s delay)",
Value = autoTeleportZone9,
Callback = function(state)
autoTeleportZone9 = state
end
})
SettingsTab:Button({
Title = "Teleport to Zone 9 Now",
Icon = "navigation",
Variant = "Secondary",
Callback = function()
local success = teleportToZone9()
if success then
WindUI:Notify({
Title = "Teleported",
Content = "Moved to Zone 9",
Duration = 2
})
else
WindUI:Notify({
Title = "Teleport Failed",
Content = "Character not found",
Duration = 3
})
end
end
})
SettingsTab:Divider()
-- Auto-load Configuration
SettingsTab:Paragraph({
Title = "Auto-load Settings",
Desc = "Configure which config to automatically load on startup",
Image = "settings-2",
ImageSize = 20,
Color = "White"
})
autoLoadToggle = SettingsTab:Toggle({
Title = "Enable Auto-load Config",
Desc = "Automatically load selected config on startup",
Value = currentSettings.autoLoadEnabled or false,
Callback = function(state)
currentSettings.autoLoadEnabled = state
saveSettings()
end
})
local availableConfigs = getAvailableConfigs()
autoLoadDropdown = SettingsTab:Dropdown({
Title = "Auto-load Config",
Values = availableConfigs,
Value = currentSettings.autoLoadConfig or "None",
SearchBarEnabled = true,
MenuWidth = 280,
Callback = function(config)
currentSettings.autoLoadConfig = config
saveSettings()
end
})
SettingsTab:Button({
Title = "Refresh Config List",
Icon = "refresh-cw",
Callback = function()
local newConfigs = getAvailableConfigs()
if autoLoadDropdown and autoLoadDropdown.Refresh then
autoLoadDropdown:Refresh(newConfigs)
end
end
})
SettingsTab:Divider()
-- Configuration Management
SettingsTab:Paragraph({
Title = "Configuration Manager",
Desc = "Save and load your settings",
Image = "save",
ImageSize = 20,
Color = "White"
})
local configName = "kasumi-config"
ConfigNameInput = SettingsTab:Input({
Title = "Config Name",
Value = configName,
Callback = function(value)
configName = value or "kasumi-config"
end
})
SettingsTab:Button({
Title = "Save Configuration",
Icon = "save",
Variant = "Primary",
Callback = function()
local name = ConfigNameInput.Get and ConfigNameInput:Get() or configName
saveConfig(name)
end
})
SettingsTab:Button({
Title = "Load Configuration",
Icon = "folder-open",
Variant = "Secondary",
Callback = function()
local name = ConfigNameInput.Get and ConfigNameInput:Get() or configName
if loadConfigWithProperSync(name) then
-- ✅ Start loops after manual load
if antiAFKEnabled then startAntiAFK() end
if autoReconnectEnabled then setupAutoReconnect() end
if autoOpenEnabled then startAutoOpenLoop() end
if obbyEnabled then startAutoFarmLoop() end
WindUI:Notify({
Title = "Config Loaded",
Content = name .. " loaded - Case: " .. selectedCase,
Duration = 3
})
else
WindUI:Notify({
Title = "Load Error",
Content = "Failed to load config: " .. name,
Icon = "x",
Duration = 3
})
end
end
})
SettingsTab:Button({
Title = "Reset to Default",
Icon = "rotate-ccw",
Variant = "Destructive",
Callback = function()
resetToDefault()
end
})
SettingsTab:Divider()
-- Initialize keybinds
setupKeybinds()
-- Initialize data on startup
task.spawn(function()
task.wait(2)
local newCases, fromGame = getAvailableCases()
availableCases = newCases
openAmount = getCaseOpenSlots()
if caseDropdown then
caseDropdown:Refresh(availableCases)
end
-- Zone 9 Auto-Teleport on Startup
if autoTeleportZone9 then
task.spawn(function()
task.wait(3)
local success1 = teleportToZone9()
if success1 then
print("✅ Teleported to Zone 9 (1/2)")
end
task.wait(1)
local success2 = teleportToZone9()
if success2 then
print("✅ Teleported to Zone 9 (2/2)")
end
end)
end
if currentSettings.autoLoadEnabled and currentSettings.autoLoadConfig ~= "None" then
task.spawn(function()
task.wait(0.5)
updateCaseDropdownProperly()
updateAllUI()
end)
WindUI:Notify({
Title = "Kasumi Hub " .. SCRIPT_VERSION,
Content = string.format("Auto-loaded: %s\nCase: %s (%d cases, %d slots)",
currentSettings.autoLoadConfig,
selectedCase,
#availableCases,
openAmount),
Duration = 6
})
else
if not table.find(availableCases, selectedCase) then
selectedCase = availableCases[1] or defaultConfig.selectedCase
end
task.spawn(function()
task.wait(0.5)
updateCaseDropdownProperly()
updateAllUI()
end)
WindUI:Notify({
Title = "Kasumi Hub " .. SCRIPT_VERSION,
Content = string.format("Ready! Case: %s\n%d cases, %d slots\nCtrl+R/F for keybinds",
selectedCase,
#availableCases,
openAmount),
Duration = 6
})
end
end)No comments yet for this script.



