Project lazarus gun mod Opensource
Key Required

Project lazarus gun mod Opensource

Project Lazarus: 💀 ZOMBIES 💀smertni*qqsmertni*qq 1.8K views 8.9K executesUpdated Jun 30, 2026
Unrated
00
Lua Script•1827 lines (65915 chars)
--[[
    Project Lazarus: ZOMBIES - Cheat Hub (V3.5 - UI Dragging Fix)
    Created for IIIIMREALONE
    
    Features:
    1. Anti-Cheat Bypass (Bypasses SendData, MemCheck, AC Tamper, ESP and ZombieBox checks)
    2. Hooked WalkSpeed & JumpPower (Bypasses game-loop resets using metamethod hooks + RenderStepped loops)
    3. Changeable Keybinds (Click on bind button next to toggles, press any key to re-bind)
    4. Premium Keybind HUD (Draggable, minimal widget displaying active binds and current states)
    5. Frame-Locked Static Ammo (Uses cached table references and active upvalue pointers to freeze ammo at 67 on RenderStepped)
    6. Ultimate Weapon Mods (GC Scan and Equipped state updates for constant 67 ammo and no recoil)
    
    GUI Controls:
    - Toggle GUI: Default [Insert] or [RightShift] (Re-bindable)
    - Toggle ESP: Default [G] (Re-bindable)
    - Toggle Weapon Mods: Default [V] (Re-bindable)
    - Toggle Speed Hack: Default [F] (Re-bindable)
    - Toggle Noclip: Default [N] (Re-bindable)
    - Instant Kill All: Default [C] (Re-bindable)
]]

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local LocalPlayer = Players.LocalPlayer

-- Reset load check
_G.LazarusHubLoaded = nil

-- Clean up any existing GUI/HUD
local oldGui = game.CoreGui:FindFirstChild("LazarusHubV3") or game.CoreGui:FindFirstChild("LazarusHub")
if oldGui then pcall(function() oldGui:Destroy() end) end
local oldHud = game.CoreGui:FindFirstChild("LazarusKeybindHUD")
if oldHud then pcall(function() oldHud:Destroy() end) end

_G.LazarusHubLoaded = true

----------------------------------------------------------------
-- CONFIGURATION & BINDS STATE
----------------------------------------------------------------
local Config = {
    -- Weapon Mods
    WeaponModsEnabled = false,
    InfiniteAmmo = false,
    AlwaysAuto = false,
    NoRecoil = false,
    NoSpread = false,
    NoSway = false,
    InstantReload = false,
    InfPenetration = false,
    RapidFire = false,
    RapidFireVal = 0.08,
    DamageMode = "Normal",
    CustomDamageVal = 100,

    -- Visuals
    EspEnabled = false,
    EspBoxes = true,
    EspNames = false,
    EspHealth = false,
    EspDistance = false,
    EspColor = Color3.fromRGB(0, 180, 255),

    -- Combat
    KillAllActive = false,
    AutoKillDelay = 0.2,
    
    -- Player
    SpeedHackEnabled = false,
    WalkSpeedValue = 45,
    JumpHackEnabled = false,
    JumpPowerValue = 70,
    InfJumpEnabled = false,
    NoclipEnabled = false
}

local Binds = {
    ToggleMenu = Enum.KeyCode.Insert,
    ESP = Enum.KeyCode.G,
    WeaponMods = Enum.KeyCode.V,
    SpeedHack = Enum.KeyCode.F,
    Noclip = Enum.KeyCode.N,
    KillAll = Enum.KeyCode.C
}

local bindNames = {
    ToggleMenu = "Toggle Menu GUI",
    ESP = "Toggle ESP",
    WeaponMods = "Toggle Weapon Mods",
    SpeedHack = "Toggle Speed Hack",
    Noclip = "Toggle Noclip",
    KillAll = "Instant Kill All"
}

local listeningToBindAction = nil
local activeBindsButtons = {}

-- Caches to avoid scanning garbage collector every frame
local activeWeaponTable = nil
local ammoUpvalues = {} -- holds list of {func, index} for active ammo variables

----------------------------------------------------------------
-- 1. METAMETHOD HOOKS (BYPASS SPEED/JUMP RESET & ANTI-CHEAT)
----------------------------------------------------------------
local SendData = ReplicatedStorage:WaitForChild("ClientRemotes"):WaitForChild("SendData")
local UpdateDamageKey = ReplicatedStorage:WaitForChild("UpdateDamageKey")

local originalStats = {}
local damageKey = nil

-- Cache original weapon stats
local function cacheWeapon(wp)
    if wp:IsA("ModuleScript") and wp.Name:sub(1,6) == "Weapon" then
        local ok, data = pcall(require, wp)
        if ok and data then
            local wIndex = wp.Name
            if not originalStats[wIndex] then
                originalStats[wIndex] = {
                    WeaponName = data.WeaponName or "Beretta M9",
                    Ammo = data.Ammo or 8,
                    StoredAmmo = data.StoredAmmo or 32,
                    MagSize = data.MagSize or 8,
                    MaxAmmo = data.MaxAmmo or 32,
                    DamageMax = data.Damage and data.Damage.Max or 20,
                    DamageMin = data.Damage and data.Damage.Min or 20,
                    FireTime = data.FireTime or 0.1,
                    Semi = (data.Semi ~= nil) and data.Semi or true,
                    ReloadTime = data.ReloadTime or 1.8,
                    Penetration = data.Penetration or 1,
                    GunKick = data.GunKick or 0.05,
                    Sway = data.Sway or 0.01,
                    Spread = data.Spread and {
                        Min = data.Spread.Min or 0,
                        Max = data.Spread.Max or 0,
                        Movement = data.Spread.Movement or 0
                    } or {Min = 0, Max = 0, Movement = 0},
                    ViewKick = data.ViewKick and {
                        Pitch = data.ViewKick.Pitch and {Min = data.ViewKick.Pitch.Min or 0, Max = data.ViewKick.Pitch.Max or 0} or {Min = 0, Max = 0},
                        Yaw = data.ViewKick.Yaw and {Min = data.ViewKick.Yaw.Min or 0, Max = data.ViewKick.Yaw.Max or 0} or {Min = 0, Max = 0}
                    } or nil
                }
            end
        end
    end
end

for _, item in ipairs(LocalPlayer.Backpack:GetChildren()) do cacheWeapon(item) end
if LocalPlayer.Character then
    for _, item in ipairs(LocalPlayer.Character:GetChildren()) do cacheWeapon(item) end
end

-- Hook UpdateDamageKey to capture the security key
local oldInvokeServer
oldInvokeServer = hookfunction(UpdateDamageKey.InvokeServer, newcclosure(function(self, ...)
    local args = {...}
    damageKey = args[1]
    print("[BYPASS] Captured Damage Key:", damageKey)
    return oldInvokeServer(self, ...)
end))

-- NewIndex Metamethod Hook for Bypassing WalkSpeed/JumpPower resets & spoofing values
local oldNewIndex
oldNewIndex = hookmetamethod(game, "__newindex", newcclosure(function(self, idx, val)
    if not checkcaller() and self:IsA("Humanoid") then
        if idx == "WalkSpeed" and Config.SpeedHackEnabled then
            return oldNewIndex(self, idx, Config.WalkSpeedValue)
        elseif idx == "JumpPower" and Config.JumpHackEnabled then
            return oldNewIndex(self, idx, Config.JumpPowerValue)
        elseif idx == "JumpHeight" and Config.JumpHackEnabled then
            return oldNewIndex(self, idx, Config.JumpPowerValue / 7.84)
        end
    end
    return oldNewIndex(self, idx, val)
end))

-- Hook Namecall to block anti-cheat checks & spoof weapon data
local oldNamecall
oldNamecall = hookmetamethod(game, "__namecall", newcclosure(function(self, ...)
    local method = getnamecallmethod()
    local args = {...}
    
    if self == SendData and (method == "FireServer" or method == "fireServer") then
        local eventName = args[1]
        if type(eventName) == "string" then
            -- Block AC detection logs
            if eventName == "AC Tamper" or eventName == "MemCheck" or eventName == "ZombieBox" or eventName == "ESP" then
                print("[BYPASS] Blocked Anti-Cheat Check:", eventName)
                return
            end
            
            -- Spoof weapon stats so the server thinks they are unmodified
            if eventName:sub(1,1) == "W" then
                local wIndex = eventName
                local default = originalStats[wIndex]
                if not default then
                    local wp = LocalPlayer.Backpack:FindFirstChild(wIndex) or (LocalPlayer.Character and LocalPlayer.Character:FindFirstChild(wIndex))
                    if wp then cacheWeapon(wp) end
                    default = originalStats[wIndex]
                end
                if default and type(args[2]) == "table" then
                    args[2].WeaponName = default.WeaponName
                    args[2].Ammo = default.Ammo
                    args[2].StoredAmmo = default.StoredAmmo
                    args[2].DamageMax = default.DamageMax
                    args[2].DamageMin = default.DamageMin
                    args[2].FireTime = default.FireTime
                end
                return oldNamecall(self, unpack(args))
            end
        end
    end
    
    -- Capture damage key from normal shooting if we missed it
    if self.Name == "Damage" and (method == "FireServer" or method == "fireServer") then
        local key = args[2]
        if key and type(key) == "number" and key >= 0 and key < 1 then
            damageKey = key
        end
    end
    
    return oldNamecall(self, ...)
end))

-- Function to search GC for existing damage key
local function getDamageKeyFromGC()
    if not getgc then return end
    local getinfo = debug.getinfo or getinfo
    if not getinfo then return end
    for _, f in ipairs(getgc()) do
        if type(f) == "function" then
            local infoOk, info = pcall(getinfo, f)
            if infoOk and info and info.source and info.source:find("WeaponScript") then
                for i = 1, 30 do
                    local ok, name, val = pcall(debug.getupvalue, f, i)
                    if ok and type(val) == "number" and val >= 0 and val < 1 then
                        damageKey = val
                        return val
                    end
                end
            end
        end
    end
end
getDamageKeyFromGC() -- Try to capture immediately

----------------------------------------------------------------
-- 2. CORE CHEAT LOGIC & LOOPS
----------------------------------------------------------------

-- Metatable helper to make Ammo and MagSize 100% read-only and static
local function makeAmmoStatic(t)
    local mt = getmetatable(t)
    if mt and mt.__isStaticAmmo then return end
    
    local oldIndex = mt and mt.__index
    local oldNewIndex = mt and mt.__newindex
    
    local newMt = {
        __isStaticAmmo = true,
        __index = function(self, key)
            if key == "Ammo" or key == "MagSize" then
                if Config.WeaponModsEnabled and Config.InfiniteAmmo then
                    return 67
                else
                    local default = originalStats[rawget(self, "WeaponName")]
                    return default and default[key] or 8
                end
            end
            if type(oldIndex) == "function" then return oldIndex(self, key)
            elseif type(oldIndex) == "table" then return oldIndex[key] end
            return rawget(self, key)
        end,
        __newindex = function(self, key, val)
            if key == "Ammo" or key == "MagSize" then
                if Config.WeaponModsEnabled and Config.InfiniteAmmo then
                    -- Ignore write to keep it static
                    return
                else
                    rawset(self, key, val)
                    return
                end
            end
            if type(oldNewIndex) == "function" then oldNewIndex(self, key, val)
            elseif type(oldNewIndex) == "table" then oldNewIndex[key] = val
            else rawset(self, key, val) end
        end
    }
    setmetatable(t, newMt)
end

-- Apply modifications to a weapon table
local function modifyWeaponTable(t, default)
    if not t or not default then return end
    
    makeAmmoStatic(t)
    
    if Config.WeaponModsEnabled then
        -- 1. Infinite Ammo (Frozen at 67 to prevent reload loops and keep never-ending status)
        if Config.InfiniteAmmo then
            rawset(t, "Ammo", nil)
            rawset(t, "MagSize", nil)
            t.StoredAmmo = 9999
            t.MaxAmmo = 9999
            t.ReloadTime = 0.02
        else
            rawset(t, "Ammo", default.Ammo)
            rawset(t, "MagSize", default.MagSize)
            t.StoredAmmo = default.StoredAmmo
            t.MaxAmmo = default.MaxAmmo
            t.ReloadTime = default.ReloadTime
        end

        -- 2. Rapid Fire
        if Config.RapidFire then
            t.FireTime = Config.RapidFireVal
        else
            t.FireTime = default.FireTime
        end

        -- 3. Always Auto
        if Config.AlwaysAuto then
            t.Semi = false
        else
            t.Semi = default.Semi
        end

        -- 4. No Recoil
        if Config.NoRecoil then
            if t.ViewKick then
                t.ViewKick.Pitch = {Min = 0, Max = 0}
                t.ViewKick.Yaw = {Min = 0, Max = 0}
            end
            t.GunKick = 0
        else
            if default.ViewKick and t.ViewKick then
                t.ViewKick.Pitch = {Min = default.ViewKick.Pitch.Min, Max = default.ViewKick.Pitch.Max}
                t.ViewKick.Yaw = {Min = default.ViewKick.Yaw.Min, Max = default.ViewKick.Yaw.Max}
            end
            t.GunKick = default.GunKick
        end

        -- 5. No Spread
        if Config.NoSpread then
            if t.Spread then
                t.Spread.Min = 0
                t.Spread.Max = 0
                t.Spread.Movement = 0
            end
        else
            if default.Spread and t.Spread then
                t.Spread.Min = default.Spread.Min
                t.Spread.Max = default.Spread.Max
                t.Spread.Movement = default.Spread.Movement
            end
        end

        -- 6. Damage Mode
        if Config.DamageMode == "One-Shot" then
            t.Damage = {Max = 99999, Min = 99999}
        elseif Config.DamageMode == "Custom" then
            t.Damage = {Max = Config.CustomDamageVal, Min = Config.CustomDamageVal}
        else
            if t.Damage then
                t.Damage.Max = default.DamageMax
                t.Damage.Min = default.DamageMin
            end
        end

        -- 7. Instant Reload (Standalone check)
        if Config.InstantReload then
            t.ReloadTime = 0.02
        else
            if not Config.InfiniteAmmo then
                t.ReloadTime = default.ReloadTime
            end
        end

        -- 8. Infinite Penetration
        if Config.InfPenetration then
            t.Penetration = 99
        else
            t.Penetration = default.Penetration
        end

        -- 9. No Sway
        if Config.NoSway then
            t.Sway = 0
        else
            t.Sway = default.Sway
        end
    else
        -- Restore all defaults
        t.Ammo = default.Ammo
        t.StoredAmmo = default.StoredAmmo
        t.MagSize = default.MagSize
        t.MaxAmmo = default.MaxAmmo
        t.FireTime = default.FireTime
        t.Semi = default.Semi
        if default.ViewKick and t.ViewKick then
            t.ViewKick.Pitch = {Min = default.ViewKick.Pitch.Min, Max = default.ViewKick.Pitch.Max}
            t.ViewKick.Yaw = {Min = default.ViewKick.Yaw.Min, Max = default.ViewKick.Yaw.Max}
        end
        t.GunKick = default.GunKick
        if default.Spread and t.Spread then
            t.Spread.Min = default.Spread.Min
            t.Spread.Max = default.Spread.Max
            t.Spread.Movement = default.Spread.Movement
        end
        if t.Damage then
            t.Damage.Max = default.DamageMax
            t.Damage.Min = default.DamageMin
        end
        t.ReloadTime = default.ReloadTime
        t.Penetration = default.Penetration
        t.Sway = default.Sway
    end
end

-- GC Scanner to overwrite Weapon Variables dynamically
local function scanAndModifyGC()
    if not getgc then return end
    local getinfo = debug.getinfo or getinfo
    if not getinfo then return end
    
    local tempAmmoUpvalues = {}
    
    for _, f in ipairs(getgc()) do
        if type(f) == "function" then
            local infoOk, info = pcall(getinfo, f)
            if infoOk and info and info.source and info.source:find("WeaponScript") then
                for i = 1, 60 do
                    local ok, name, val = pcall(debug.getupvalue, f, i)
                    if not ok or not name then break end
                    
                    -- Cache current weapon table pointer
                    if type(val) == "table" and val.WeaponName and (val.FireTime or val.Semi ~= nil) then
                        activeWeaponTable = val
                        local default = originalStats[val.WeaponName]
                        if default then
                            modifyWeaponTable(val, default)
                        end
                    end
                    
                    -- Record active Ammo variable locations to freeze them on render thread
                    if name == "Ammo" then
                        table.insert(tempAmmoUpvalues, {func = f, index = i})
                    elseif name == "MagSize" then
                        table.insert(tempAmmoUpvalues, {func = f, index = i})
                    end
                    
                    if Config.WeaponModsEnabled then
                        if name == "FireTime" and Config.RapidFire then
                            pcall(debug.setupvalue, f, i, Config.RapidFireVal)
                        elseif name == "Semi" and Config.AlwaysAuto then
                            pcall(debug.setupvalue, f, i, false)
                        elseif name == "ReloadTime" and Config.InstantReload then
                            pcall(debug.setupvalue, f, i, 0.02)
                        elseif name == "Spread" and Config.NoSpread then
                            pcall(debug.setupvalue, f, i, {Min = 0, Max = 0, Movement = 0})
                        elseif name == "Ammo" and Config.InfiniteAmmo then
                            pcall(debug.setupvalue, f, i, 67)
                        elseif name == "MagSize" and Config.InfiniteAmmo then
                            pcall(debug.setupvalue, f, i, 67)
                        end
                    end
                end
            end
        end
    end
    
    if #tempAmmoUpvalues > 0 then
        ammoUpvalues = tempAmmoUpvalues
    end
end

-- Active Weapon Loop
local function updateAllWeapons()
    for _, item in ipairs(LocalPlayer.Backpack:GetChildren()) do
        if item:IsA("ModuleScript") and item.Name:sub(1,6) == "Weapon" then
            cacheWeapon(item)
            local ok, data = pcall(require, item)
            if ok and data then modifyWeaponTable(data, originalStats[item.Name]) end
        end
    end
    if LocalPlayer.Character then
        for _, item in ipairs(LocalPlayer.Character:GetChildren()) do
            if item:IsA("ModuleScript") and item.Name:sub(1,6) == "Weapon" then
                cacheWeapon(item)
                local ok, data = pcall(require, item)
                if ok and data then modifyWeaponTable(data, originalStats[item.Name]) end
            end
        end
    end
    
    if _G.Equipped and type(_G.Equipped) == "table" then
        local default = originalStats[_G.Equipped.WeaponName]
        if default then modifyWeaponTable(_G.Equipped, default) end
    end
    scanAndModifyGC()
end

task.spawn(function()
    while true do
        task.wait(0.3)
        updateAllWeapons()
    end
end)

LocalPlayer.Backpack.ChildAdded:Connect(function(child)
    task.wait(0.2)
    cacheWeapon(child)
    updateAllWeapons()
end)

-- Real-time loops (NoRecoil & Speedhack & Infinite Ammo Locking on RenderStepped)
local function applyPhysicalMods()
    if LocalPlayer.Character then
        -- 1. No Recoil Camera Lock
        if Config.WeaponModsEnabled and Config.NoRecoil then
            local RotCam = LocalPlayer.Character:FindFirstChild("RotCam")
            if RotCam then
                if RotCam:IsA("Vector3Value") then RotCam.Value = Vector3.new(0, 0, 0)
                elseif RotCam:IsA("NumberValue") then RotCam.Value = 0
                elseif RotCam:IsA("CFrameValue") then RotCam.Value = CFrame.new() end
            end
        end
        -- 2. Force WalkSpeed and JumpPower (Every Frame to bypass game loop resets)
        local hum = LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        if hum then
            if Config.SpeedHackEnabled then
                hum.WalkSpeed = Config.WalkSpeedValue
            end
            if Config.JumpHackEnabled then
                if hum.UseJumpPower then
                    hum.JumpPower = Config.JumpPowerValue
                else
                    hum.JumpHeight = Config.JumpPowerValue / 7.84
                end
            end
        end
    end
    
    -- 3. LOCK AMMO TO STATIC 67 EVERY SINGLE FRAME (Prevents visual flicker and recoil delays)
    if Config.WeaponModsEnabled and Config.InfiniteAmmo then
        -- Force active cached weapon tables directly
        if activeWeaponTable then
            activeWeaponTable.Ammo = 67
            activeWeaponTable.MagSize = 67
        end
        if _G.Equipped and type(_G.Equipped) == "table" then
            _G.Equipped.Ammo = 67
            _G.Equipped.MagSize = 67
        end
        -- Force direct local variables of the active shoot closure every frame
        for _, loc in ipairs(ammoUpvalues) do
            pcall(debug.setupvalue, loc.func, loc.index, 67)
        end
    end
end

RunService.RenderStepped:Connect(applyPhysicalMods)

-- Infinite Jump
UserInputService.JumpRequest:Connect(function()
    if Config.InfJumpEnabled and LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid") then
        LocalPlayer.Character:FindFirstChildOfClass("Humanoid"):ChangeState(Enum.HumanoidStateType.Jumping)
    end
end)

-- Noclip Loop
local NoclipConnection = nil
local function toggleNoclip(state)
    if state then
        NoclipConnection = RunService.Stepped:Connect(function()
            if LocalPlayer.Character then
                for _, part in ipairs(LocalPlayer.Character:GetDescendants()) do
                    if part:IsA("BasePart") and part.CanCollide then
                        part.CanCollide = false
                    end
                end
            end
        end)
    else
        if NoclipConnection then
            NoclipConnection:Disconnect()
            NoclipConnection = nil
        end
    end
end

-- ESP System
local function applyESP(zombie)
    if not Config.EspEnabled then return end
    
    local hl = zombie:FindFirstChild("ESPHighlight")
    if Config.EspBoxes then
        if not hl then
            hl = Instance.new("Highlight")
            hl.Name = "ESPHighlight"
            hl.FillColor = Config.EspColor
            hl.OutlineColor = Color3.fromRGB(255, 255, 255)
            hl.FillTransparency = 0.6
            hl.OutlineTransparency = 0.1
            hl.Adornee = zombie
            hl.Parent = zombie
        else
            hl.FillColor = Config.EspColor
        end
    else
        if hl then hl:Destroy() end
    end
    
    local billboard = zombie:FindFirstChild("ESPBillboard")
    if Config.EspNames or Config.EspDistance or Config.EspHealth then
        if not billboard then
            billboard = Instance.new("BillboardGui")
            billboard.Name = "ESPBillboard"
            billboard.AlwaysOnTop = true
            billboard.Size = UDim2.new(0, 200, 0, 50)
            billboard.ExtentsOffset = Vector3.new(0, 3.5, 0)
            billboard.Adornee = zombie:FindFirstChild("Head") or zombie:FindFirstChild("Torso") or zombie
            
            local container = Instance.new("Frame")
            container.Size = UDim2.new(1, 0, 1, 0)
            container.BackgroundTransparency = 1
            container.Parent = billboard
            
            local list = Instance.new("UIListLayout")
            list.HorizontalAlignment = Enum.HorizontalAlignment.Center
            list.VerticalAlignment = Enum.VerticalAlignment.Bottom
            list.Padding = UDim.new(0, 2)
            list.Parent = container

            local nameLabel = Instance.new("TextLabel")
            nameLabel.Name = "NameLabel"
            nameLabel.Size = UDim2.new(1, 0, 0, 14)
            nameLabel.BackgroundTransparency = 1
            nameLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
            nameLabel.TextStrokeTransparency = 0
            nameLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
            nameLabel.Font = Enum.Font.GothamBold
            nameLabel.TextSize = 11
            nameLabel.Text = zombie.Name
            nameLabel.Parent = container

            local hpLabel = Instance.new("TextLabel")
            hpLabel.Name = "HPLabel"
            hpLabel.Size = UDim2.new(1, 0, 0, 12)
            hpLabel.BackgroundTransparency = 1
            hpLabel.TextStrokeTransparency = 0
            hpLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
            hpLabel.Font = Enum.Font.GothamSemibold
            hpLabel.TextSize = 10
            hpLabel.Parent = container

            local distLabel = Instance.new("TextLabel")
            distLabel.Name = "DistLabel"
            distLabel.Size = UDim2.new(1, 0, 0, 12)
            distLabel.BackgroundTransparency = 1
            distLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
            distLabel.TextStrokeTransparency = 0
            distLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
            distLabel.Font = Enum.Font.Gotham
            distLabel.TextSize = 9
            distLabel.Parent = container
            
            billboard.Parent = zombie
        end
        
        local container = billboard:FindFirstChildOfClass("Frame")
        if container then
            local nameL = container:FindFirstChild("NameLabel")
            local hpL = container:FindFirstChild("HPLabel")
            local distL = container:FindFirstChild("DistLabel")
            
            local hum = zombie:FindFirstChildOfClass("Humanoid")
            local root = zombie:FindFirstChild("HumanoidRootPart") or zombie:FindFirstChild("Torso")
            
            if nameL then nameL.Visible = Config.EspNames end
            
            if hpL and hum then
                hpL.Visible = Config.EspHealth
                hpL.Text = math.floor(hum.Health) .. " / " .. math.floor(hum.MaxHealth) .. " HP"
                local pct = math.clamp(hum.Health / hum.MaxHealth, 0, 1)
                hpL.TextColor3 = Color3.fromHSV(pct * 0.33, 1, 1)
            end
            
            if distL and root and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                distL.Visible = Config.EspDistance
                local dist = math.floor((LocalPlayer.Character.HumanoidRootPart.Position - root.Position).Magnitude)
                distL.Text = dist .. " studs"
            end
        end
    else
        if billboard then billboard:Destroy() end
    end
end

local function removeESP(zombie)
    local hl = zombie:FindFirstChild("ESPHighlight")
    if hl then hl:Destroy() end
    local billboard = zombie:FindFirstChild("ESPBillboard")
    if billboard then billboard:Destroy() end
end

local function updateESPState()
    local Baddies = workspace:FindFirstChild("Baddies")
    if not Baddies then return end
    for _, z in ipairs(Baddies:GetChildren()) do
        if Config.EspEnabled then applyESP(z) else removeESP(z) end
    end
end

workspace:WaitForChild("Baddies").ChildAdded:Connect(function(child)
    task.wait(0.1)
    if Config.EspEnabled then applyESP(child) end
end)

task.spawn(function()
    while true do
        task.wait(0.1)
        if Config.EspEnabled then
            local Baddies = workspace:FindFirstChild("Baddies")
            if Baddies then
                for _, z in ipairs(Baddies:GetChildren()) do applyESP(z) end
            end
        end
    end
end)

-- Kill All Function
local function killAllZombies()
    if not damageKey then getDamageKeyFromGC() end
    if not damageKey then return false, "No damage key captured yet." end
    
    local Baddies = workspace:FindFirstChild("Baddies")
    if not Baddies then return false, "No zombies container!" end
    
    local count = 0
    for _, z in ipairs(Baddies:GetChildren()) do
        local hum = z:FindFirstChildOfClass("Humanoid")
        local head = z:FindFirstChild("Head") or z:FindFirstChild("Torso")
        if hum and head and hum.Health > 0 then
            local damageEvent = hum:FindFirstChild("Damage")
            if damageEvent then
                pcall(function()
                    damageEvent:FireServer({
                        Damage = hum.MaxHealth + 1000,
                        BodyPart = head,
                        GibPower = 3,
                        Force = 15,
                        Source = head.Position,
                        WeaponName = "Beretta M9"
                    }, damageKey)
                    count = count + 1
                end)
            end
        end
    end
    return true, "Killed " .. count .. " zombies!"
end

task.spawn(function()
    while true do
        if Config.KillAllActive then killAllZombies() end
        task.wait(Config.AutoKillDelay)
    end
end)

-- Dragging functionality helper (Defined first to avoid attempt to call a nil value)
local function makeDraggable(frame, parentFrame)
    local dragging, dragInput, dragStart, startPos
    frame.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true
            dragStart = input.Position
            startPos = parentFrame.Position
            
            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                end
            end)
        end
    end)
    frame.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
            dragInput = input
        end
    end)
    UserInputService.InputChanged:Connect(function(input)
        if input == dragInput and dragging then
            local delta = input.Position - dragStart
            parentFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
        end
    end)
end

----------------------------------------------------------------
-- 3. PREMIUM HUD & KEYBINDS DISPLAY
----------------------------------------------------------------
local HudGui = Instance.new("ScreenGui")
HudGui.Name = "LazarusKeybindHUD"
HudGui.ResetOnSpawn = false
HudGui.Parent = game.CoreGui

local HudFrame = Instance.new("Frame")
HudFrame.Name = "HudFrame"
HudFrame.Size = UDim2.new(0, 200, 0, 195)
HudFrame.Position = UDim2.new(1, -220, 0, 80)
HudFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 20)
HudFrame.BackgroundTransparency = 0.25
HudFrame.BorderSizePixel = 0
HudFrame.Active = true
HudFrame.Parent = HudGui

local hudCorner = Instance.new("UICorner")
hudCorner.CornerRadius = UDim.new(0, 8)
hudCorner.Parent = HudFrame

local hudStroke = Instance.new("UIStroke")
hudStroke.Color = Config.EspColor
hudStroke.Thickness = 1.2
hudStroke.Parent = HudFrame

local HudHeader = Instance.new("Frame")
HudHeader.Size = UDim2.new(1, 0, 0, 28)
HudHeader.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
HudHeader.BorderSizePixel = 0
HudHeader.Parent = HudFrame
makeDraggable(HudHeader, HudFrame)

local hudHeaderCorner = Instance.new("UICorner")
hudHeaderCorner.CornerRadius = UDim.new(0, 8)
hudHeaderCorner.Parent = HudHeader

local hudHeaderBlend = Instance.new("Frame")
hudHeaderBlend.Size = UDim2.new(1, 0, 0, 8)
hudHeaderBlend.Position = UDim2.new(0, 0, 1, -8)
hudHeaderBlend.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
hudHeaderBlend.BorderSizePixel = 0
hudHeaderBlend.Parent = HudHeader

local HudTitle = Instance.new("TextLabel")
HudTitle.Size = UDim2.new(1, 0, 1, 0)
HudTitle.Position = UDim2.new(0, 10, 0, 0)
HudTitle.BackgroundTransparency = 1
HudTitle.Text = "ACTIVE BINDS"
HudTitle.TextColor3 = Color3.fromRGB(255, 255, 255)
HudTitle.Font = Enum.Font.GothamBold
HudTitle.TextSize = 10
HudTitle.TextXAlignment = Enum.TextXAlignment.Left
HudTitle.Parent = HudHeader

local hudList = Instance.new("UIListLayout")
hudList.Padding = UDim.new(0, 4)
hudList.HorizontalAlignment = Enum.HorizontalAlignment.Center
hudList.Parent = HudFrame

local hudSpacer = Instance.new("Frame")
hudSpacer.Size = UDim2.new(0, 10, 0, 32)
hudSpacer.BackgroundTransparency = 1
hudSpacer.Parent = HudFrame
hudSpacer.LayoutOrder = -1

local hudLabels = {}

local function createHudLabel(actionKey, displayName)
    local frame = Instance.new("Frame")
    frame.Size = UDim2.new(1, -16, 0, 18)
    frame.BackgroundTransparency = 1
    frame.Parent = HudFrame
    
    local keyLabel = Instance.new("TextLabel")
    keyLabel.Size = UDim2.new(0, 52, 1, 0)
    keyLabel.BackgroundTransparency = 1
    keyLabel.TextColor3 = Config.EspColor
    keyLabel.Font = Enum.Font.GothamBold
    keyLabel.TextSize = 9
    keyLabel.Text = "[" .. Binds[actionKey].Name .. "]"
    keyLabel.TextXAlignment = Enum.TextXAlignment.Left
    keyLabel.Parent = frame

    local nameLabel = Instance.new("TextLabel")
    nameLabel.Size = UDim2.new(1, -100, 1, 0)
    nameLabel.Position = UDim2.new(0, 56, 0, 0)
    nameLabel.BackgroundTransparency = 1
    nameLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
    nameLabel.Font = Enum.Font.GothamSemibold
    nameLabel.TextSize = 9
    nameLabel.Text = displayName
    nameLabel.TextXAlignment = Enum.TextXAlignment.Left
    nameLabel.Parent = frame

    local statusLabel = Instance.new("TextLabel")
    statusLabel.Size = UDim2.new(0, 40, 1, 0)
    statusLabel.Position = UDim2.new(1, -40, 0, 0)
    statusLabel.BackgroundTransparency = 1
    statusLabel.Font = Enum.Font.GothamBold
    statusLabel.TextSize = 9
    statusLabel.TextXAlignment = Enum.TextXAlignment.Right
    statusLabel.Parent = frame

    hudLabels[actionKey] = {
        key = keyLabel,
        status = statusLabel
    }
end

createHudLabel("ToggleMenu", "Menu GUI")
createHudLabel("ESP", "Zombie ESP")
createHudLabel("WeaponMods", "Weapon Mods")
createHudLabel("SpeedHack", "Speed Hack")
createHudLabel("Noclip", "Noclip Hack")
createHudLabel("KillAll", "Instant Kill")

local function updateHUD()
    for actionKey, ui in pairs(hudLabels) do
        ui.key.Text = "[" .. Binds[actionKey].Name .. "]"
        
        local state = false
        if actionKey == "ToggleMenu" then
            local mainFrame = game.CoreGui:FindFirstChild("LazarusHubV3") and game.CoreGui.LazarusHubV3:FindFirstChild("MainFrame")
            state = mainFrame and mainFrame.Visible or false
        elseif actionKey == "ESP" then state = Config.EspEnabled
        elseif actionKey == "WeaponMods" then state = Config.WeaponModsEnabled
        elseif actionKey == "SpeedHack" then state = Config.SpeedHackEnabled
        elseif actionKey == "Noclip" then state = Config.NoclipEnabled
        elseif actionKey == "KillAll" then state = Config.KillAllActive end
        
        if state then
            ui.status.TextColor3 = Color3.fromRGB(0, 255, 100)
            ui.status.Text = "ON"
        else
            ui.status.TextColor3 = Color3.fromRGB(150, 150, 150)
            ui.status.Text = "OFF"
        end
    end
end
updateHUD()

----------------------------------------------------------------
-- 4. PREMIUM UI CREATION (V3.5 - Color Theme Sync & Dynamic Binds)
----------------------------------------------------------------
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "LazarusHubV3"
ScreenGui.ResetOnSpawn = false
ScreenGui.Parent = game.CoreGui

-- Toast Notification Helper
local function showToast(text, duration)
    duration = duration or 2
    local toast = Instance.new("Frame")
    toast.Size = UDim2.new(0, 260, 0, 45)
    toast.Position = UDim2.new(1, -280, 1, 50)
    toast.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
    toast.BorderSizePixel = 0
    toast.ZIndex = 10
    toast.Parent = ScreenGui
    
    local toastCorner = Instance.new("UICorner")
    toastCorner.CornerRadius = UDim.new(0, 6)
    toastCorner.Parent = toast
    
    local toastStroke = Instance.new("UIStroke")
    toastStroke.Color = Config.EspColor
    toastStroke.Thickness = 1.5
    toastStroke.Parent = toast
    
    local toastLabel = Instance.new("TextLabel")
    toastLabel.Size = UDim2.new(1, -20, 1, 0)
    toastLabel.Position = UDim2.new(0, 10, 0, 0)
    toastLabel.BackgroundTransparency = 1
    toastLabel.Text = text
    toastLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
    toastLabel.Font = Enum.Font.GothamSemibold
    toastLabel.TextSize = 12
    toastLabel.TextWrapped = true
    toastLabel.ZIndex = 10
    toastLabel.Parent = toast
    
    task.spawn(function()
        task.wait(0.05)
        pcall(function()
            TweenService:Create(toast, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
                Position = UDim2.new(1, -280, 1, -65)
            }):Play()
        end)
        
        task.wait(duration)
        
        pcall(function()
            local tween = TweenService:Create(toast, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {
                Position = UDim2.new(1, -280, 1, 50)
            })
            tween.Completed:Connect(function() toast:Destroy() end)
            tween:Play()
        end)
    end)
end

-- Main Frame
local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.Size = UDim2.new(0, 560, 0, 420)
MainFrame.Position = UDim2.new(0.5, -280, 0.5, -210)
MainFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 20)
MainFrame.BorderSizePixel = 0
MainFrame.Active = true
MainFrame.Parent = ScreenGui

local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 12)
mainCorner.Parent = MainFrame

local mainStroke = Instance.new("UIStroke")
mainStroke.Color = Config.EspColor
mainStroke.Thickness = 1.5
mainStroke.Parent = MainFrame

-- Header
local Header = Instance.new("Frame")
Header.Size = UDim2.new(1, 0, 0, 45)
Header.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
Header.BorderSizePixel = 0
Header.Parent = MainFrame
makeDraggable(Header, MainFrame)

local headerCorner = Instance.new("UICorner")
headerCorner.CornerRadius = UDim.new(0, 12)
headerCorner.Parent = Header

local headerBlend = Instance.new("Frame")
headerBlend.Size = UDim2.new(1, 0, 0, 15)
headerBlend.Position = UDim2.new(0, 0, 1, -15)
headerBlend.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
headerBlend.BorderSizePixel = 0
headerBlend.Parent = Header

local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1, -100, 1, 0)
Title.Position = UDim2.new(0, 15, 0, 0)
Title.BackgroundTransparency = 1
Title.Text = "PROJECT LAZARUS HUB — V3.5"
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
Title.Font = Enum.Font.GothamBold
Title.TextSize = 15
Title.TextXAlignment = Enum.TextXAlignment.Left
Title.Parent = Header

local Subtitle = Instance.new("TextLabel")
Subtitle.Size = UDim2.new(0, 150, 0, 15)
Subtitle.Position = UDim2.new(0, 290, 0.5, -7)
Subtitle.BackgroundTransparency = 1
Subtitle.Text = "[Insert] to Hide Menu"
Subtitle.TextColor3 = Config.EspColor
Subtitle.Font = Enum.Font.GothamSemibold
Subtitle.TextSize = 11
Subtitle.TextXAlignment = Enum.TextXAlignment.Right
Subtitle.Parent = Header

-- Close Button
local CloseBtn = Instance.new("TextButton")
CloseBtn.Size = UDim2.new(0, 30, 0, 30)
CloseBtn.Position = UDim2.new(1, -40, 0.5, -15)
CloseBtn.BackgroundTransparency = 1
CloseBtn.Text = "✕"
CloseBtn.TextColor3 = Color3.fromRGB(150, 150, 150)
CloseBtn.Font = Enum.Font.GothamBold
CloseBtn.TextSize = 16
CloseBtn.Parent = Header

CloseBtn.MouseButton1Click:Connect(function()
    toggleNoclip(false)
    removeESP(workspace)
    pcall(function() HudGui:Destroy() end)
    ScreenGui:Destroy()
    _G.LazarusHubLoaded = nil
end)
CloseBtn.MouseEnter:Connect(function() CloseBtn.TextColor3 = Color3.fromRGB(255, 70, 70) end)
CloseBtn.MouseLeave:Connect(function() CloseBtn.TextColor3 = Color3.fromRGB(150, 150, 150) end)


-- Sidebar (Left side navigation)
local Sidebar = Instance.new("Frame")
Sidebar.Size = UDim2.new(0, 140, 1, -45)
Sidebar.Position = UDim2.new(0, 0, 0, 45)
Sidebar.BackgroundColor3 = Color3.fromRGB(12, 12, 17)
Sidebar.BorderSizePixel = 0
Sidebar.Parent = MainFrame

local sidebarCorner = Instance.new("UICorner")
sidebarCorner.CornerRadius = UDim.new(0, 12)
sidebarCorner.Parent = Sidebar

local sidebarBlend = Instance.new("Frame")
sidebarBlend.Size = UDim2.new(0, 15, 1, -45)
sidebarBlend.Position = UDim2.new(0, 125, 0, 45)
sidebarBlend.BackgroundColor3 = Color3.fromRGB(12, 12, 17)
sidebarBlend.BorderSizePixel = 0
sidebarBlend.Parent = MainFrame

local tabList = Instance.new("UIListLayout")
tabList.Padding = UDim.new(0, 5)
tabList.HorizontalAlignment = Enum.HorizontalAlignment.Center
tabList.Parent = Sidebar

-- Tab Containers (Right side container)
local Container = Instance.new("Frame")
Container.Size = UDim2.new(1, -160, 1, -60)
Container.Position = UDim2.new(0, 150, 0, 55)
Container.BackgroundTransparency = 1
Container.Parent = MainFrame

local pages = {}
local activePage = nil
local activeTabBtn = nil

local function createPage(name)
    local page = Instance.new("ScrollingFrame")
    page.Size = UDim2.new(1, 0, 1, 0)
    page.BackgroundTransparency = 1
    page.BorderSizePixel = 0
    page.ScrollBarThickness = 4
    page.ScrollBarImageColor3 = Config.EspColor
    page.Visible = false
    page.AutomaticCanvasSize = Enum.AutomaticSize.Y
    page.CanvasSize = UDim2.new(0, 0, 0, 0)
    page.Parent = Container
    
    local list = Instance.new("UIListLayout")
    list.Padding = UDim.new(0, 8)
    list.Parent = page
    
    pages[name] = page
    return page
end

-- Helper to switch pages
local function selectTab(name, btn)
    if activePage then activePage.Visible = false end
    if activeTabBtn then
        TweenService:Create(activeTabBtn, TweenInfo.new(0.2), {
            BackgroundColor3 = Color3.fromRGB(22, 22, 30),
            TextColor3 = Color3.fromRGB(150, 150, 150)
        }):Play()
    end
    
    activePage = pages[name]
    activePage.Visible = true
    activeTabBtn = btn
    TweenService:Create(btn, TweenInfo.new(0.2), {
        BackgroundColor3 = Color3.fromRGB(0, 130, 200),
        TextColor3 = Color3.fromRGB(255, 255, 255)
    }):Play()
end

-- Create Tab Button
local function createTabButton(name)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(0, 125, 0, 35)
    btn.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
    btn.BorderSizePixel = 0
    btn.Text = name
    btn.TextColor3 = Color3.fromRGB(150, 150, 150)
    btn.Font = Enum.Font.GothamSemibold
    btn.TextSize = 12
    btn.Parent = Sidebar
    
    local btnCorner = Instance.new("UICorner")
    btnCorner.CornerRadius = UDim.new(0, 6)
    btnCorner.Parent = btn
    
    btn.MouseButton1Click:Connect(function()
        selectTab(name, btn)
    end)
    
    return btn
end

-- Initialize Pages
local combatPage = createPage("Combat")
local weaponPage = createPage("Weapons")
local visualsPage = createPage("Visuals")
local playerPage = createPage("Player")

local combatBtn = createTabButton("Combat")
local weaponBtn = createTabButton("Weapons")
local visualsBtn = createTabButton("Visuals")
local playerBtn = createTabButton("Player")

-- Add spacer
local spacer = Instance.new("Frame")
spacer.Size = UDim2.new(0, 10, 0, 5)
spacer.BackgroundTransparency = 1
spacer.Parent = Sidebar
spacer.LayoutOrder = -1

selectTab("Combat", combatBtn)

----------------------------------------------------------------
-- UI ELEMENT HELPERS WITH TWEENS & INTERACTIVE KEYBINDS
----------------------------------------------------------------

-- Helper: Create Toggle Row with Bindable Keyboard Key
local function createToggleRow(parentPage, labelText, defaultVal, bindAction, callback)
    local row = Instance.new("Frame")
    row.Size = UDim2.new(1, -10, 0, 45)
    row.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
    row.BorderSizePixel = 0
    row.Parent = parentPage
    
    local rowCorner = Instance.new("UICorner")
    rowCorner.CornerRadius = UDim.new(0, 6)
    rowCorner.Parent = row
    
    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(0.45, 0, 1, 0)
    label.Position = UDim2.new(0, 12, 0, 0)
    label.BackgroundTransparency = 1
    label.Text = labelText
    label.TextColor3 = Color3.fromRGB(255, 255, 255)
    label.Font = Enum.Font.GothamSemibold
    label.TextSize = 13
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = row

    -- Changeable Keybind Button
    local bindBtn = Instance.new("TextButton")
    bindBtn.Size = UDim2.new(0, 65, 0, 22)
    bindBtn.Position = UDim2.new(0.8, -135, 0.5, -11)
    bindBtn.BackgroundColor3 = Color3.fromRGB(33, 33, 43)
    bindBtn.BorderSizePixel = 0
    bindBtn.Text = bindAction and ("[" .. Binds[bindAction].Name .. "]") or "NONE"
    bindBtn.TextColor3 = Config.EspColor
    bindBtn.Font = Enum.Font.GothamBold
    bindBtn.TextSize = 10
    bindBtn.Parent = row

    local bindCorner = Instance.new("UICorner")
    bindCorner.CornerRadius = UDim.new(0, 4)
    bindCorner.Parent = bindBtn

    if bindAction then
        activeBindsButtons[bindAction] = bindBtn
        bindBtn.MouseButton1Click:Connect(function()
            listeningToBindAction = bindAction
            bindBtn.Text = "[ ... ]"
            bindBtn.TextColor3 = Color3.fromRGB(255, 200, 0)
            showToast("Press any key to bind: " .. bindNames[bindAction])
        end)
    end
    
    local toggleBtn = Instance.new("TextButton")
    toggleBtn.Size = UDim2.new(0, 60, 0, 25)
    toggleBtn.Position = UDim2.new(1, -72, 0.5, -12)
    toggleBtn.BackgroundColor3 = defaultVal and Color3.fromRGB(0, 180, 255) or Color3.fromRGB(40, 40, 50)
    toggleBtn.BorderSizePixel = 0
    toggleBtn.Text = defaultVal and "ON" or "OFF"
    toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
    toggleBtn.Font = Enum.Font.GothamBold
    toggleBtn.TextSize = 11
    toggleBtn.Parent = row
    
    local toggleCorner = Instance.new("UICorner")
    toggleCorner.CornerRadius = UDim.new(0, 4)
    toggleCorner.Parent = toggleBtn
    
    local state = defaultVal
    local function updateVisuals()
        local targetColor = state and Color3.fromRGB(0, 180, 255) or Color3.fromRGB(40, 40, 50)
        TweenService:Create(toggleBtn, TweenInfo.new(0.2), {BackgroundColor3 = targetColor}):Play()
        toggleBtn.Text = state and "ON" or "OFF"
        updateHUD()
    end
    
    local function toggle()
        state = not state
        updateVisuals()
        callback(state)
    end
    
    toggleBtn.MouseButton1Click:Connect(toggle)
    
    row.MouseEnter:Connect(function()
        TweenService:Create(row, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(28, 28, 38)}):Play()
    end)
    row.MouseLeave:Connect(function()
        TweenService:Create(row, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(22, 22, 30)}):Play()
    end)
    
    return {
        toggle = toggle,
        setState = function(newState)
            state = newState
            updateVisuals()
            callback(state)
        end,
        getState = function() return state end
    }
end

-- Helper: Create Button Row with dynamic Keybinds
local function createButtonRow(parentPage, labelText, btnText, bindAction, callback)
    local row = Instance.new("Frame")
    row.Size = UDim2.new(1, -10, 0, 45)
    row.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
    row.BorderSizePixel = 0
    row.Parent = parentPage
    
    local rowCorner = Instance.new("UICorner")
    rowCorner.CornerRadius = UDim.new(0, 6)
    rowCorner.Parent = row
    
    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(0.45, 0, 1, 0)
    label.Position = UDim2.new(0, 12, 0, 0)
    label.BackgroundTransparency = 1
    label.Text = labelText
    label.TextColor3 = Color3.fromRGB(255, 255, 255)
    label.Font = Enum.Font.GothamSemibold
    label.TextSize = 13
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = row
    
    -- Changeable Keybind Button
    local bindBtn = Instance.new("TextButton")
    bindBtn.Size = UDim2.new(0, 65, 0, 22)
    bindBtn.Position = UDim2.new(0.8, -135, 0.5, -11)
    bindBtn.BackgroundColor3 = Color3.fromRGB(33, 33, 43)
    bindBtn.BorderSizePixel = 0
    bindBtn.Text = bindAction and ("[" .. Binds[bindAction].Name .. "]") or "NONE"
    bindBtn.TextColor3 = Config.EspColor
    bindBtn.Font = Enum.Font.GothamBold
    bindBtn.TextSize = 10
    bindBtn.Parent = row

    local bindCorner = Instance.new("UICorner")
    bindCorner.CornerRadius = UDim.new(0, 4)
    bindCorner.Parent = bindBtn

    if bindAction then
        activeBindsButtons[bindAction] = bindBtn
        bindBtn.MouseButton1Click:Connect(function()
            listeningToBindAction = bindAction
            bindBtn.Text = "[ ... ]"
            bindBtn.TextColor3 = Color3.fromRGB(255, 200, 0)
            showToast("Press any key to bind: " .. bindNames[bindAction])
        end)
    end
    
    local actionBtn = Instance.new("TextButton")
    actionBtn.Size = UDim2.new(0, 80, 0, 25)
    actionBtn.Position = UDim2.new(1, -92, 0.5, -12)
    actionBtn.BackgroundColor3 = Color3.fromRGB(0, 130, 200)
    actionBtn.BorderSizePixel = 0
    actionBtn.Text = btnText
    actionBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
    actionBtn.Font = Enum.Font.GothamBold
    actionBtn.TextSize = 11
    actionBtn.Parent = row
    
    local actCorner = Instance.new("UICorner")
    actCorner.CornerRadius = UDim.new(0, 4)
    actCorner.Parent = actionBtn
    
    actionBtn.MouseButton1Click:Connect(callback)
    
    actionBtn.MouseEnter:Connect(function() 
        TweenService:Create(actionBtn, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(0, 150, 230)}):Play()
    end)
    actionBtn.MouseLeave:Connect(function() 
        TweenService:Create(actionBtn, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(0, 130, 200)}):Play()
    end)
end

-- Helper: Create Slider Row
local function createSliderRow(parentPage, labelText, min, max, defaultVal, callback)
    local row = Instance.new("Frame")
    row.Size = UDim2.new(1, -10, 0, 55)
    row.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
    row.BorderSizePixel = 0
    row.Parent = parentPage
    
    local rowCorner = Instance.new("UICorner")
    rowCorner.CornerRadius = UDim.new(0, 6)
    rowCorner.Parent = row
    
    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(0.5, 0, 0, 25)
    label.Position = UDim2.new(0, 12, 0, 2)
    label.BackgroundTransparency = 1
    label.Text = labelText
    label.TextColor3 = Color3.fromRGB(255, 255, 255)
    label.Font = Enum.Font.GothamSemibold
    label.TextSize = 13
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = row
    
    local valueLabel = Instance.new("TextLabel")
    valueLabel.Size = UDim2.new(0.4, 0, 0, 25)
    valueLabel.Position = UDim2.new(0.6, -12, 0, 2)
    valueLabel.BackgroundTransparency = 1
    valueLabel.Text = tostring(defaultVal)
    valueLabel.TextColor3 = Color3.fromRGB(0, 180, 255)
    valueLabel.Font = Enum.Font.GothamBold
    valueLabel.TextSize = 13
    valueLabel.TextXAlignment = Enum.TextXAlignment.Right
    valueLabel.Parent = row
    
    local sliderBg = Instance.new("Frame")
    sliderBg.Size = UDim2.new(1, -24, 0, 6)
    sliderBg.Position = UDim2.new(0, 12, 0, 36)
    sliderBg.BackgroundColor3 = Color3.fromRGB(40, 40, 50)
    sliderBg.BorderSizePixel = 0
    sliderBg.Parent = row
    
    local sliderBgCorner = Instance.new("UICorner")
    sliderBgCorner.CornerRadius = UDim.new(0, 3)
    sliderBgCorner.Parent = sliderBg
    
    local sliderFill = Instance.new("Frame")
    sliderFill.Size = UDim2.new((defaultVal - min) / (max - min), 0, 1, 0)
    sliderFill.BackgroundColor3 = Color3.fromRGB(0, 180, 255)
    sliderFill.BorderSizePixel = 0
    sliderFill.Parent = sliderBg
    
    local sliderFillCorner = Instance.new("UICorner")
    sliderFillCorner.CornerRadius = UDim.new(0, 3)
    sliderFillCorner.Parent = sliderFill
    
    local sliderBtn = Instance.new("ImageButton")
    sliderBtn.Size = UDim2.new(0, 14, 0, 14)
    sliderBtn.Position = UDim2.new((defaultVal - min) / (max - min), -7, 0.5, -7)
    sliderBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
    sliderBtn.BorderSizePixel = 0
    sliderBtn.Parent = sliderBg
    
    local sliderBtnCorner = Instance.new("UICorner")
    sliderBtnCorner.CornerRadius = UDim.new(0, 7)
    sliderBtnCorner.Parent = sliderBtn
    
    local active = false
    local function updateSlider(input)
        local posX = math.clamp((input.Position.X - sliderBg.AbsolutePosition.X) / sliderBg.AbsoluteSize.X, 0, 1)
        sliderFill.Size = UDim2.new(posX, 0, 1, 0)
        sliderBtn.Position = UDim2.new(posX, -7, 0.5, -7)
        
        local val = min + (max - min) * posX
        if max - min > 10 then
            val = math.floor(val)
        else
            val = tonumber(string.format("%.3f", val))
        end
        valueLabel.Text = tostring(val)
        callback(val)
    end
    
    sliderBtn.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            active = true
        end
    end)
    
    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            active = false
        end
    end)
    
    UserInputService.InputChanged:Connect(function(input)
        if active and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
            updateSlider(input)
        end
    end)
end

-- Helper: Create Choice Selector (Dropdown replacement)
local function createDropdownRow(parentPage, labelText, options, defaultOption, callback)
    local row = Instance.new("Frame")
    row.Size = UDim2.new(1, -10, 0, 45)
    row.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
    row.BorderSizePixel = 0
    row.Parent = parentPage
    
    local rowCorner = Instance.new("UICorner")
    rowCorner.CornerRadius = UDim.new(0, 6)
    rowCorner.Parent = row
    
    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(0.5, 0, 1, 0)
    label.Position = UDim2.new(0, 12, 0, 0)
    label.BackgroundTransparency = 1
    label.Text = labelText
    label.TextColor3 = Color3.fromRGB(255, 255, 255)
    label.Font = Enum.Font.GothamSemibold
    label.TextSize = 13
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = row

    local dropdownBtn = Instance.new("TextButton")
    dropdownBtn.Size = UDim2.new(0, 120, 0, 25)
    dropdownBtn.Position = UDim2.new(1, -132, 0.5, -12)
    dropdownBtn.BackgroundColor3 = Color3.fromRGB(40, 40, 50)
    dropdownBtn.BorderSizePixel = 0
    dropdownBtn.Text = defaultOption
    dropdownBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
    dropdownBtn.Font = Enum.Font.GothamBold
    dropdownBtn.TextSize = 11
    dropdownBtn.Parent = row

    local dropCorner = Instance.new("UICorner")
    dropCorner.CornerRadius = UDim.new(0, 4)
    dropCorner.Parent = dropdownBtn

    local currentIndex = table.find(options, defaultOption) or 1
    
    dropdownBtn.MouseButton1Click:Connect(function()
        currentIndex = currentIndex + 1
        if currentIndex > #options then currentIndex = 1 end
        local selected = options[currentIndex]
        dropdownBtn.Text = selected
        callback(selected)
    end)
end

-- Helper: Create Color Picker Circle row
local function createColorPickerRow(parentPage, labelText, defaultColor, callback)
    local row = Instance.new("Frame")
    row.Size = UDim2.new(1, -10, 0, 45)
    row.BackgroundColor3 = Color3.fromRGB(22, 22, 30)
    row.BorderSizePixel = 0
    row.Parent = parentPage
    
    local rowCorner = Instance.new("UICorner")
    rowCorner.CornerRadius = UDim.new(0, 6)
    rowCorner.Parent = row
    
    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(0.4, 0, 1, 0)
    label.Position = UDim2.new(0, 12, 0, 0)
    label.BackgroundTransparency = 1
    label.Text = labelText
    label.TextColor3 = Color3.fromRGB(255, 255, 255)
    label.Font = Enum.Font.GothamSemibold
    label.TextSize = 13
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = row

    local colorContainer = Instance.new("Frame")
    colorContainer.Size = UDim2.new(0.6, -12, 1, 0)
    colorContainer.Position = UDim2.new(0.4, 0, 0, 0)
    colorContainer.BackgroundTransparency = 1
    colorContainer.Parent = row
    
    local list = Instance.new("UIListLayout")
    list.FillDirection = Enum.FillDirection.Horizontal
    list.HorizontalAlignment = Enum.HorizontalAlignment.Right
    list.VerticalAlignment = Enum.VerticalAlignment.Center
    list.Padding = UDim.new(0, 8)
    list.Parent = colorContainer

    local colors = {
        Red = Color3.fromRGB(255, 60, 60),
        Green = Color3.fromRGB(0, 255, 100),
        Blue = Color3.fromRGB(0, 180, 255),
        Yellow = Color3.fromRGB(255, 220, 0),
        Purple = Color3.fromRGB(190, 80, 255),
        White = Color3.fromRGB(255, 255, 255)
    }

    for name, color in pairs(colors) do
        local colorBtn = Instance.new("ImageButton")
        colorBtn.Size = UDim2.new(0, 18, 0, 18)
        colorBtn.BackgroundColor3 = color
        colorBtn.BorderSizePixel = 0
        colorBtn.Parent = colorContainer
        
        local corner = Instance.new("UICorner")
        corner.CornerRadius = UDim.new(1, 0)
        corner.Parent = colorBtn

        local stroke = Instance.new("UIStroke")
        stroke.Thickness = 1.5
        stroke.Color = (color == defaultColor) and Color3.fromRGB(255, 255, 255) or Color3.fromRGB(0, 0, 0)
        stroke.Parent = colorBtn

        colorBtn.MouseButton1Click:Connect(function()
            for _, btn in ipairs(colorContainer:GetChildren()) do
                if btn:IsA("ImageButton") then
                    btn:FindFirstChildOfClass("UIStroke").Color = Color3.fromRGB(0, 0, 0)
                end
            end
            stroke.Color = Color3.fromRGB(255, 255, 255)
            callback(color)
        end)
    end
end

----------------------------------------------------------------
-- 5. POPULATE TAB PAGES
----------------------------------------------------------------

-- COMBAT PAGE
local loopKillRow = createToggleRow(combatPage, "Loop Kill All Zombies", Config.KillAllActive, nil, function(state)
    Config.KillAllActive = state
    showToast("[COMBAT] Loop Kill All " .. (state and "Enabled" or "Disabled"))
end)

createSliderRow(combatPage, "Auto Kill Delay (Secs)", 0.05, 1.5, Config.AutoKillDelay, function(val)
    Config.AutoKillDelay = val
end)

createButtonRow(combatPage, "Instant Kill All Zombies", "Kill All", "KillAll", function()
    local ok, res = killAllZombies()
    showToast("[COMBAT] " .. res)
end)


-- WEAPONS PAGE
local weaponModsRow = createToggleRow(weaponPage, "Enable Weapon Mods", Config.WeaponModsEnabled, "WeaponMods", function(state)
    Config.WeaponModsEnabled = state
    updateAllWeapons()
    showToast("[WEAPONS] Weapon Mods " .. (state and "Activated" or "Restored to normal"))
end)

createToggleRow(weaponPage, "Infinite Clip & Ammo", Config.InfiniteAmmo, nil, function(state)
    Config.InfiniteAmmo = state
    updateAllWeapons()
end)

createToggleRow(weaponPage, "Rapid Fire (Custom rate)", Config.RapidFire, nil, function(state)
    Config.RapidFire = state
    updateAllWeapons()
end)

createSliderRow(weaponPage, "Rapid Fire Rate", 0.01, 0.25, Config.RapidFireVal, function(val)
    Config.RapidFireVal = val
    updateAllWeapons()
end)

createToggleRow(weaponPage, "Force Always Automatic", Config.AlwaysAuto, nil, function(state)
    Config.AlwaysAuto = state
    updateAllWeapons()
end)

createToggleRow(weaponPage, "No Weapon Recoil", Config.NoRecoil, nil, function(state)
    Config.NoRecoil = state
    updateAllWeapons()
end)

createToggleRow(weaponPage, "No Weapon Spread", Config.NoSpread, nil, function(state)
    Config.NoSpread = state
    updateAllWeapons()
end)

createToggleRow(weaponPage, "No Scope Sway", Config.NoSway, nil, function(state)
    Config.NoSway = state
    updateAllWeapons()
end)

createToggleRow(weaponPage, "Instant Reload", Config.InstantReload, nil, function(state)
    Config.InstantReload = state
    updateAllWeapons()
end)

createToggleRow(weaponPage, "Infinite Penetration", Config.InfPenetration, nil, function(state)
    Config.InfPenetration = state
    updateAllWeapons()
end)

createDropdownRow(weaponPage, "Damage Preset Mod", {"Normal", "Custom", "One-Shot"}, Config.DamageMode, function(choice)
    Config.DamageMode = choice
    updateAllWeapons()
    showToast("[WEAPONS] Damage mode: " .. choice)
end)

createSliderRow(weaponPage, "Custom Damage Value", 20, 1000, Config.CustomDamageVal, function(val)
    Config.CustomDamageVal = val
    if Config.DamageMode == "Custom" then
        updateAllWeapons()
    end
end)


-- VISUALS PAGE
local espRow = createToggleRow(visualsPage, "Zombie ESP (Master Switch)", Config.EspEnabled, "ESP", function(state)
    Config.EspEnabled = state
    updateESPState()
    showToast("[VISUALS] Zombie ESP " .. (state and "ON" or "OFF"))
end)

createToggleRow(visualsPage, "ESP Show Outlines / Box", Config.EspBoxes, nil, function(state)
    Config.EspBoxes = state
    updateESPState()
end)

createToggleRow(visualsPage, "ESP Show Names", Config.EspNames, nil, function(state)
    Config.EspNames = state
    updateESPState()
end)

createToggleRow(visualsPage, "ESP Show Health Stats", Config.EspHealth, nil, function(state)
    Config.EspHealth = state
    updateESPState()
end)

createToggleRow(visualsPage, "ESP Show Distance", Config.EspDistance, nil, function(state)
    Config.EspDistance = state
    updateESPState()
end)

createColorPickerRow(visualsPage, "ESP Custom Color Theme", Config.EspColor, function(color)
    Config.EspColor = color
    mainStroke.Color = color
    Subtitle.TextColor3 = color
    hudStroke.Color = color
    HudTitle.TextColor3 = color
    updateESPState()
end)


-- PLAYER PAGE
local speedRow = createToggleRow(playerPage, "Speed Hack", Config.SpeedHackEnabled, "SpeedHack", function(state)
    Config.SpeedHackEnabled = state
    if not state and LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid") then
        LocalPlayer.Character:FindFirstChildOfClass("Humanoid").WalkSpeed = 16
    end
    showToast("[PLAYER] Speed Hack " .. (state and "ON" or "OFF"))
end)

createSliderRow(playerPage, "WalkSpeed Limit", 16, 150, Config.WalkSpeedValue, function(val)
    Config.WalkSpeedValue = val
end)

local jumpRow = createToggleRow(playerPage, "Jump Hack", Config.JumpHackEnabled, nil, function(state)
    Config.JumpHackEnabled = state
    if not state and LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid") then
        local hum = LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        if hum.UseJumpPower then
            hum.JumpPower = 50
        else
            hum.JumpHeight = 7.2
        end
    end
    showToast("[PLAYER] Jump Hack " .. (state and "ON" or "OFF"))
end)

createSliderRow(playerPage, "JumpPower Limit", 50, 250, Config.JumpPowerValue, function(val)
    Config.JumpPowerValue = val
end)

local infJumpRow = createToggleRow(playerPage, "Infinite Jump", Config.InfJumpEnabled, nil, function(state)
    Config.InfJumpEnabled = state
    showToast("[PLAYER] Infinite Jump " .. (state and "Enabled" or "Disabled"))
end)

local noclipRow = createToggleRow(playerPage, "Noclip (Wall Hack)", Config.NoclipEnabled, "Noclip", function(state)
    Config.NoclipEnabled = state
    toggleNoclip(state)
    showToast("[PLAYER] Noclip " .. (state and "Enabled" or "Disabled"))
end)

-- Menu GUI Bind Row (Header Settings)
createToggleRow(playerPage, "Show Binds HUD Widget", true, "ToggleMenu", function(state)
    HudFrame.Visible = state
end)

----------------------------------------------------------------
-- 6. GLOBAL KEYBOARD INPUT & REBINDING LISTENER
----------------------------------------------------------------
UserInputService.InputBegan:Connect(function(input, gameProcessed)
    -- Handle Key Rebinding Process First
    if listeningToBindAction then
        if input.KeyCode ~= Enum.KeyCode.Unknown then
            local newKey = input.KeyCode
            Binds[listeningToBindAction] = newKey
            
            -- Update UI Button Text
            local btn = activeBindsButtons[listeningToBindAction]
            if btn then
                btn.Text = "[" .. newKey.Name .. "]"
                btn.TextColor3 = Config.EspColor
            end
            
            showToast("Successfully bound " .. bindNames[listeningToBindAction] .. " to: " .. newKey.Name)
            listeningToBindAction = nil
            updateHUD()
        end
        return
    end

    if gameProcessed then return end
    
    -- Dynamic Binds Evaluator
    if input.KeyCode == Binds.ToggleMenu then
        MainFrame.Visible = not MainFrame.Visible
        showToast("[HUB] Menu GUI " .. (MainFrame.Visible and "Shown" or "Hidden"))
        updateHUD()
    end
    
    if input.KeyCode == Binds.KillAll then
        local ok, res = killAllZombies()
        showToast("[COMBAT] " .. res)
    end
    
    if input.KeyCode == Binds.ESP then
        espRow.setState(not espRow.getState())
    end
    
    if input.KeyCode == Binds.WeaponMods then
        weaponModsRow.setState(not weaponModsRow.getState())
    end
    
    if input.KeyCode == Binds.SpeedHack then
        speedRow.setState(not speedRow.getState())
    end

    if input.KeyCode == Binds.Noclip then
        noclipRow.setState(not noclipRow.getState())
    end
end)

showToast("[HUB] V3.5 Loaded! UI Dragging issue fixed.", 4)
print("[HUB] Lazarus Premium Hub V3.5 successfully loaded and optimized!")

Features & Information

gun mod speed kill all others
#lazarus#gun mod#OP

Community Comments (0)

No comments yet for this script.

More Scripts for Project Lazarus: 💀 ZOMBIES 💀