Tower of Zombies Script (Delta Mobile) – ToZ Hub: Aimbot, Inf Ammo, Fly 28 24 No Key

Tower of Zombies Script (Delta Mobile) – ToZ Hub: Aimbot, Inf Ammo, Fly

Tower of Zombies · Roblox
Play
No key Mobile friendly Working · Nov 4
Report

Description

Tower of Zombies Hub is a Tower of Zombies script you can run in Delta on Android, iOS or PC. It includes aimbot, auto bring, infinite ammo and more. It uses Rayfield and has menus in many languages. Created by Rival960. No key.

Key Features

  • Aimbot that locks onto the closest zombie
  • Max zombie distance slider
  • Auto Bring zombies with radius and interval
  • Infinite Ammo
  • Freeze Ammo
  • Fly with fly speed
  • NoClip
  • WalkSpeed and Infinite Jump
  • Fullbright
  • Anti AFK

Every climb in Tower of Zombies is a new random layout, with waves of undead between you and five bosses at the top. Rival960’s Tower of Zombies script (v1.1.1, “Combat Update”) is built to keep you shooting and climbing without running dry.

Combat

Option Details
Aimbot Turns your camera to the closest living zombie, aiming for its head hitbox
Max Zombie Distance 50–500 studs, 300 by default
Auto Bring Pulls zombies to a spot in front of you. Bring Radius is 1–10 studs (3 by default) and Bring Interval is 0.1–2 s (0.3 by default)
Infinite Ammo Keeps clip and reserve topped up at 99,999
Freeze Ammo Holds your ammo at whatever it was when you switched this on

If both ammo toggles are on, Infinite Ammo wins.

Movement and tools

Movement covers Fly (10–300 speed, with on-screen up and down buttons for touch players), NoClip, WalkSpeed up to 250 and Infinite Jump. The Tools & Visuals tab adds Fullbright and Anti AFK, plus a language dropdown with 21 options from English to Danish. A language change only applies after you execute the script again.

Launching the hub

No key is involved, and the Rayfield window opens with its key system switched off. The code box is the complete open-source file. The only thing it fetches is Rayfield from sirius.menu. Start a climb, then run it from Delta’s editor. Settings aren’t saved between sessions. Version 1.1.1 fixed a freeze on some executors. Besides Delta, the listing names Fluxus, Arceus X and Codex, with PC executors last.

Tower of Zombies FAQ

Does the aimbot hit bosses? It targets anything alive in the game’s active-zombie folder within your max distance. Whether bosses sit there isn’t stated, so test it on the first one.

Is it the only script for this game? Yes. It’s the sole Tower of Zombies listing on the site.

Climbing tip: on Hard and Extreme, keep Bring Radius small and the interval near 0.3 s. A tight pack right in front of the aimbot dies faster than a crowd spread around you, and you’re not left with zombies closing in from behind on a narrow floor.

Tested With
DeltaCodexArceus XFluxusPC executors
Script CodeTower of Zombies Hub (Rival960)
--[[
    ================================================================
    Tower of Zombies Hub — Tower of Zombies
    Created by Rival960 with the help of Claude
    Version: v1.1.1 | Languages: 21 | Rayfield UI
    Status: tested in-game
    ================================================================
]]

-- Task library compatibility shim (Volt and other executors)
if not task then
    task = {
        wait  = function(t) return wait(t or 0) end,
        spawn = function(f, ...) return spawn(f, ...) end,
        defer = function(f, ...) return spawn(f, ...) end,
    }
end

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

local LocalPlayer = Players.LocalPlayer

-- ================================================================
-- Language System (21 languages)
-- ================================================================
local CurrentLang = "EN"

local Translations = {
    EN = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "by Rival960",
        TabHome             = "Home",
        TabCombat           = "Combat",
        TabMovement         = "Movement",
        TabTools            = "Tools & Visuals",
        CreditsTitle        = "Credits",
        CreditsContent      = "Created by Rival960 with the help of AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Combat Update",
        ReleaseNotesTitle   = "v1.1.1 — Release Notes",
        ReleaseNotesContent = "v1.1.0: Infinite Ammo, Freeze Ammo, Aimbot improvements.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nFound a bug or want to request a feature? Open an issue on GitHub (Rival99900/Roblox-Scripts) or post on ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Bring",
        BringRadius         = "Bring Radius (studs)",
        BringInterval       = "Bring Interval (s)",
        MaxZombieDist       = "Max Zombie Distance",
        InfiniteAmmo        = "Infinite Ammo",
        FreezeAmmo          = "Freeze Ammo",
        FlyToggle           = "Fly",
        FlySpeed            = "Fly Speed",
        NoClip              = "NoClip",
        WalkSpeed           = "Walk Speed",
        InfJump             = "Infinite Jump",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Fullbright",
        LanguageSelect      = "Language",
        LangNote            = "Language change requires re-execution",
    },
    FR = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "par Rival960",
        TabHome             = "Accueil",
        TabCombat           = "Combat",
        TabMovement         = "Déplacement",
        TabTools            = "Outils & Visuels",
        CreditsTitle        = "Crédits",
        CreditsContent      = "Créé par Rival960 avec l'aide de l'IA\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Mise à Jour Combat",
        ReleaseNotesTitle   = "v1.1.1 — Notes de Version",
        ReleaseNotesContent = "Nouveau en v1.1.0 : Munitions Infinies, Geler les Munitions, correction de pénétration des murs de l'Aimbot, système de hooks de munitions.\nv1.1.1 : Executor compatibility fix — resolved game freeze on Volt and other executors.\nVous avez trouvé un bug ou souhaitez demander une fonctionnalité ? Ouvrez un ticket sur GitHub (Rival99900/Roblox-Scripts) ou postez sur ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Attirer",
        BringRadius         = "Rayon d'attrait (studs)",
        BringInterval       = "Intervalle d'attrait (s)",
        MaxZombieDist       = "Distance Max Zombie",
        InfiniteAmmo        = "Munitions Infinies",
        FreezeAmmo          = "Geler les Munitions",
        FlyToggle           = "Vol",
        FlySpeed            = "Vitesse de Vol",
        NoClip              = "NoClip",
        WalkSpeed           = "Vitesse de Marche",
        InfJump             = "Saut Infini",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Luminosité Max",
        LanguageSelect      = "Langue",
        LangNote            = "Le changement de langue nécessite une ré-exécution",
    },
    DE = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "von Rival960",
        TabHome             = "Start",
        TabCombat           = "Kampf",
        TabMovement         = "Bewegung",
        TabTools            = "Tools & Visuals",
        CreditsTitle        = "Credits",
        CreditsContent      = "Erstellt von Rival960 mit KI-Hilfe\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Kampf-Update",
        ReleaseNotesTitle   = "v1.1.1 — Versionshinweise",
        ReleaseNotesContent = "Neu in v1.1.0: Unendlich Munition, Munition Einfrieren, Aimbot Wanddurchdringungsfix, Munitions-Hook-System.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nBug gefunden oder Feature-Wunsch? Erstelle ein Issue auf GitHub (Rival99900/Roblox-Scripts) oder schreibe auf ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Anziehen",
        BringRadius         = "Anzugsradius (studs)",
        BringInterval       = "Anzugsintervall (s)",
        MaxZombieDist       = "Max Zombie-Distanz",
        InfiniteAmmo        = "Unendlich Munition",
        FreezeAmmo          = "Munition Einfrieren",
        FlyToggle           = "Fliegen",
        FlySpeed            = "Fluggeschwindigkeit",
        NoClip              = "NoClip",
        WalkSpeed           = "Laufgeschwindigkeit",
        InfJump             = "Unendlicher Sprung",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Vollhelligkeit",
        LanguageSelect      = "Sprache",
        LangNote            = "Sprachänderung erfordert Neuausführung",
    },
    ES = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "por Rival960",
        TabHome             = "Inicio",
        TabCombat           = "Combate",
        TabMovement         = "Movimiento",
        TabTools            = "Herramientas",
        CreditsTitle        = "Créditos",
        CreditsContent      = "Creado por Rival960 con ayuda de IA\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Actualización de Combate",
        ReleaseNotesTitle   = "v1.1.1 — Notas de Versión",
        ReleaseNotesContent = "Nuevo en v1.1.0: Munición Infinita, Congelar Munición, corrección de penetración de muros del Aimbot, sistema de ganchos de munición.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\n¿Encontraste un error o quieres pedir una función? Abre un issue en GitHub (Rival99900/Roblox-Scripts) o publica en ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Atraer",
        BringRadius         = "Radio de Atracción (studs)",
        BringInterval       = "Intervalo de Atracción (s)",
        MaxZombieDist       = "Distancia Máx Zombie",
        InfiniteAmmo        = "Munición Infinita",
        FreezeAmmo          = "Congelar Munición",
        FlyToggle           = "Volar",
        FlySpeed            = "Velocidad de Vuelo",
        NoClip              = "NoClip",
        WalkSpeed           = "Velocidad de Caminar",
        InfJump             = "Salto Infinito",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Brillo Total",
        LanguageSelect      = "Idioma",
        LangNote            = "El cambio de idioma requiere re-ejecución",
    },
    PT = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "por Rival960",
        TabHome             = "Início",
        TabCombat           = "Combate",
        TabMovement         = "Movimento",
        TabTools            = "Ferramentas",
        CreditsTitle        = "Créditos",
        CreditsContent      = "Criado por Rival960 com ajuda de IA\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Atualização de Combate",
        ReleaseNotesTitle   = "v1.1.1 — Notas da Versão",
        ReleaseNotesContent = "Novo em v1.1.0: Munição Infinita, Congelar Munição, correção de penetração de paredes do Aimbot, sistema de hooks de munição.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nEncontrou um bug ou quer sugerir uma função? Abra uma issue no GitHub (Rival99900/Roblox-Scripts) ou publique no ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Atrair",
        BringRadius         = "Raio de Atração (studs)",
        BringInterval       = "Intervalo de Atração (s)",
        MaxZombieDist       = "Distância Máx Zumbi",
        InfiniteAmmo        = "Munição Infinita",
        FreezeAmmo          = "Congelar Munição",
        FlyToggle           = "Voar",
        FlySpeed            = "Velocidade de Voo",
        NoClip              = "NoClip",
        WalkSpeed           = "Velocidade de Caminhada",
        InfJump             = "Salto Infinito",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Brilho Total",
        LanguageSelect      = "Idioma",
        LangNote            = "Mudança de idioma requer re-execução",
    },
    RU = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "от Rival960",
        TabHome             = "Главная",
        TabCombat           = "Бой",
        TabMovement         = "Движение",
        TabTools            = "Инструменты",
        CreditsTitle        = "Авторы",
        CreditsContent      = "Создано Rival960 с помощью ИИ\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Боевое Обновление",
        ReleaseNotesTitle   = "v1.1.1 — Примечания к версии",
        ReleaseNotesContent = "Новое в v1.1.0: Бесконечные патроны, Заморозить патроны, исправление проникновения сквозь стены аимбота, система хуков патронов.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nНашли баг или хотите предложить функцию? Создайте issue на GitHub (Rival99900/Roblox-Scripts) или напишите на ScriptBlox.",
        Aimbot              = "Аимбот",
        AutoBring           = "Авто Притяжение",
        BringRadius         = "Радиус притяжения (ст.)",
        BringInterval       = "Интервал притяжения (с)",
        MaxZombieDist       = "Макс дистанция зомби",
        InfiniteAmmo        = "Бесконечные патроны",
        FreezeAmmo          = "Заморозить патроны",
        FlyToggle           = "Полёт",
        FlySpeed            = "Скорость полёта",
        NoClip              = "NoClip",
        WalkSpeed           = "Скорость ходьбы",
        InfJump             = "Бесконечный прыжок",
        AntiAFK             = "Анти-АФК",
        Fullbright          = "Полная яркость",
        LanguageSelect      = "Язык",
        LangNote            = "Смена языка требует повторного запуска",
    },
    IT = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "di Rival960",
        TabHome             = "Home",
        TabCombat           = "Combattimento",
        TabMovement         = "Movimento",
        TabTools            = "Strumenti",
        CreditsTitle        = "Crediti",
        CreditsContent      = "Creato da Rival960 con l'aiuto dell'IA\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Aggiornamento Combattimento",
        ReleaseNotesTitle   = "v1.1.1 — Note di Versione",
        ReleaseNotesContent = "Nuovo in v1.1.0: Munizioni Infinite, Blocca Munizioni, fix penetrazione pareti Aimbot, sistema di hook munizioni.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nHai trovato un bug o vuoi richiedere una funzione? Apri un'issue su GitHub (Rival99900/Roblox-Scripts) o scrivi su ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Attira",
        BringRadius         = "Raggio di Attrazione (studs)",
        BringInterval       = "Intervallo di Attrazione (s)",
        MaxZombieDist       = "Distanza Max Zombie",
        InfiniteAmmo        = "Munizioni Infinite",
        FreezeAmmo          = "Blocca Munizioni",
        FlyToggle           = "Volo",
        FlySpeed            = "Velocità di Volo",
        NoClip              = "NoClip",
        WalkSpeed           = "Velocità di Camminata",
        InfJump             = "Salto Infinito",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Piena Luminosità",
        LanguageSelect      = "Lingua",
        LangNote            = "Il cambio lingua richiede una ri-esecuzione",
    },
    NL = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "door Rival960",
        TabHome             = "Start",
        TabCombat           = "Gevecht",
        TabMovement         = "Beweging",
        TabTools            = "Tools & Visuals",
        CreditsTitle        = "Credits",
        CreditsContent      = "Gemaakt door Rival960 met AI-hulp\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Gevechtsupdate",
        ReleaseNotesTitle   = "v1.1.1 — Versienotities",
        ReleaseNotesContent = "Nieuw in v1.1.0: Oneindige Munitie, Bevriezing Munitie, Aimbot muurpenetratie fix, munitie hook systeem.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nBug gevonden of wil je een functie aanvragen? Open een issue op GitHub (Rival99900/Roblox-Scripts) of post op ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Aantrekken",
        BringRadius         = "Aantrekkingsradius (studs)",
        BringInterval       = "Aantrekkingsinterval (s)",
        MaxZombieDist       = "Max Zombie Afstand",
        InfiniteAmmo        = "Oneindige Munitie",
        FreezeAmmo          = "Bevriezing Munitie",
        FlyToggle           = "Vliegen",
        FlySpeed            = "Vliegsnelheid",
        NoClip              = "NoClip",
        WalkSpeed           = "Loopsnelheid",
        InfJump             = "Oneindig Springen",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Maximale Helderheid",
        LanguageSelect      = "Taal",
        LangNote            = "Taalwijziging vereist heruitvoering",
    },
    PL = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "przez Rival960",
        TabHome             = "Strona główna",
        TabCombat           = "Walka",
        TabMovement         = "Ruch",
        TabTools            = "Narzędzia",
        CreditsTitle        = "Kredyty",
        CreditsContent      = "Stworzone przez Rival960 z pomocą AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Aktualizacja Walki",
        ReleaseNotesTitle   = "v1.1.1 — Informacje o Wersji",
        ReleaseNotesContent = "Nowe w v1.1.0: Nieskończona Amunicja, Zamroź Amunicję, naprawa przenikania przez ściany Aimbot, system haków amunicji.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nZnalazłeś błąd lub chcesz zgłosić funkcję? Otwórz issue na GitHub (Rival99900/Roblox-Scripts) lub napisz na ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Przyciąganie",
        BringRadius         = "Promień przyciągania (studs)",
        BringInterval       = "Interwał przyciągania (s)",
        MaxZombieDist       = "Maks. dystans zombie",
        InfiniteAmmo        = "Nieskończona Amunicja",
        FreezeAmmo          = "Zamroź Amunicję",
        FlyToggle           = "Latanie",
        FlySpeed            = "Prędkość lotu",
        NoClip              = "NoClip",
        WalkSpeed           = "Prędkość chodu",
        InfJump             = "Nieskończony Skok",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Pełna jasność",
        LanguageSelect      = "Język",
        LangNote            = "Zmiana języka wymaga ponownego uruchomienia",
    },
    ZH = {
        WindowTitle         = "行尸走肉枢纽",
        WindowSubtitle      = "由 Rival960",
        TabHome             = "主页",
        TabCombat           = "战斗",
        TabMovement         = "移动",
        TabTools            = "工具与视觉",
        CreditsTitle        = "致谢",
        CreditsContent      = "由 Rival960 借助 AI 创建\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — 战斗更新",
        ReleaseNotesTitle   = "v1.1.1 — 版本说明",
        ReleaseNotesContent = "v1.1.0 新内容:无限弹药、冻结弹药、瞄准助手穿墙修复、弹药钩子系统。\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\n发现漏洞或想申请功能?请在 GitHub (Rival99900/Roblox-Scripts) 提交 issue 或在 ScriptBlox 发帖。",
        Aimbot              = "自动瞄准",
        AutoBring           = "自动吸引",
        BringRadius         = "吸引半径 (格)",
        BringInterval       = "吸引间隔 (秒)",
        MaxZombieDist       = "最大僵尸距离",
        InfiniteAmmo        = "无限弹药",
        FreezeAmmo          = "冻结弹药",
        FlyToggle           = "飞行",
        FlySpeed            = "飞行速度",
        NoClip              = "穿墙",
        WalkSpeed           = "行走速度",
        InfJump             = "无限跳跃",
        AntiAFK             = "防离线",
        Fullbright          = "全亮",
        LanguageSelect      = "语言",
        LangNote            = "语言更改需要重新执行",
    },
    JA = {
        WindowTitle         = "ゾンビタワーハブ",
        WindowSubtitle      = "Rival960 制作",
        TabHome             = "ホーム",
        TabCombat           = "戦闘",
        TabMovement         = "移動",
        TabTools            = "ツール",
        CreditsTitle        = "クレジット",
        CreditsContent      = "Rival960 と AI の協力で作成\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — 戦闘アップデート",
        ReleaseNotesTitle   = "v1.1.1 — リリースノート",
        ReleaseNotesContent = "v1.1.0の新機能:無限弾薬、弾薬固定、エイムボット壁貫通修正、弾薬フックシステム。\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nバグ発見や機能リクエストはGitHub (Rival99900/Roblox-Scripts) のissueまたはScriptBloxに投稿してください。",
        Aimbot              = "エイムボット",
        AutoBring           = "自動引き寄せ",
        BringRadius         = "引き寄せ半径 (スタッド)",
        BringInterval       = "引き寄せ間隔 (秒)",
        MaxZombieDist       = "最大ゾンビ距離",
        InfiniteAmmo        = "無限弾薬",
        FreezeAmmo          = "弾薬固定",
        FlyToggle           = "フライ",
        FlySpeed            = "飛行速度",
        NoClip              = "ノークリップ",
        WalkSpeed           = "歩行速度",
        InfJump             = "無限ジャンプ",
        AntiAFK             = "アンチAFK",
        Fullbright          = "フルブライト",
        LanguageSelect      = "言語",
        LangNote            = "言語変更は再実行が必要です",
    },
    TR = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "Rival960 tarafından",
        TabHome             = "Ana Sayfa",
        TabCombat           = "Savaş",
        TabMovement         = "Hareket",
        TabTools            = "Araçlar",
        CreditsTitle        = "Krediler",
        CreditsContent      = "Rival960 tarafından AI yardımıyla yapılmıştır\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Savaş Güncellemesi",
        ReleaseNotesTitle   = "v1.1.1 — Sürüm Notları",
        ReleaseNotesContent = "v1.1.0'daki yenilikler: Sonsuz Mermi, Mermiyi Dondur, Aimbot duvar nüfuz düzeltmesi, mermi kanca sistemi.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nBir hata buldunuz veya özellik talep etmek mi istiyorsunuz? GitHub'da (Rival99900/Roblox-Scripts) issue açın veya ScriptBlox'ta paylaşın.",
        Aimbot              = "Aimbot",
        AutoBring           = "Otomatik Çekme",
        BringRadius         = "Çekme Yarıçapı (studs)",
        BringInterval       = "Çekme Aralığı (s)",
        MaxZombieDist       = "Maks Zombi Mesafesi",
        InfiniteAmmo        = "Sonsuz Mermi",
        FreezeAmmo          = "Mermiyi Dondur",
        FlyToggle           = "Uçuş",
        FlySpeed            = "Uçuş Hızı",
        NoClip              = "NoClip",
        WalkSpeed           = "Yürüyüş Hızı",
        InfJump             = "Sonsuz Zıplama",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Tam Parlaklık",
        LanguageSelect      = "Dil",
        LangNote            = "Dil değişikliği yeniden başlatma gerektirir",
    },
    KO = {
        WindowTitle         = "좀비 타워 허브",
        WindowSubtitle      = "Rival960 제작",
        TabHome             = "홈",
        TabCombat           = "전투",
        TabMovement         = "이동",
        TabTools            = "도구",
        CreditsTitle        = "크레딧",
        CreditsContent      = "Rival960이 AI의 도움으로 제작\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — 전투 업데이트",
        ReleaseNotesTitle   = "v1.1.1 — 릴리즈 노트",
        ReleaseNotesContent = "v1.1.0 새 기능: 무한 탄약, 탄약 고정, 에임봇 벽 관통 수정, 탄약 훅 시스템.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\n버그를 찾거나 기능을 요청하고 싶다면? GitHub (Rival99900/Roblox-Scripts)에 이슈를 열거나 ScriptBlox에 게시하세요.",
        Aimbot              = "에임봇",
        AutoBring           = "자동 끌어오기",
        BringRadius         = "끌어오기 반경 (스터드)",
        BringInterval       = "끌어오기 간격 (초)",
        MaxZombieDist       = "최대 좀비 거리",
        InfiniteAmmo        = "무한 탄약",
        FreezeAmmo          = "탄약 고정",
        FlyToggle           = "비행",
        FlySpeed            = "비행 속도",
        NoClip              = "노클립",
        WalkSpeed           = "걷기 속도",
        InfJump             = "무한 점프",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "전체 밝기",
        LanguageSelect      = "언어",
        LangNote            = "언어 변경은 재실행이 필요합니다",
    },
    AR = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "بواسطة Rival960",
        TabHome             = "الرئيسية",
        TabCombat           = "القتال",
        TabMovement         = "الحركة",
        TabTools            = "الأدوات",
        CreditsTitle        = "الاعتمادات",
        CreditsContent      = "تم إنشاؤه بواسطة Rival960 بمساعدة الذكاء الاصطناعي\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — تحديث القتال",
        ReleaseNotesTitle   = "v1.1.1 — ملاحظات الإصدار",
        ReleaseNotesContent = "جديد في v1.1.0: ذخيرة لا نهائية، تجميد الذخيرة، إصلاح اختراق الجدران للأيمبوت، نظام خطافات الذخيرة.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nوجدت خطأ أو تريد طلب ميزة؟ افتح issue على GitHub (Rival99900/Roblox-Scripts) أو انشر على ScriptBlox.",
        Aimbot              = "أيمبوت",
        AutoBring           = "جذب تلقائي",
        BringRadius         = "نطاق الجذب (وحدة)",
        BringInterval       = "فترة الجذب (ث)",
        MaxZombieDist       = "أقصى مسافة للزومبي",
        InfiniteAmmo        = "ذخيرة لا نهائية",
        FreezeAmmo          = "تجميد الذخيرة",
        FlyToggle           = "طيران",
        FlySpeed            = "سرعة الطيران",
        NoClip              = "اختراق الجدران",
        WalkSpeed           = "سرعة المشي",
        InfJump             = "قفز لانهائي",
        AntiAFK             = "مانع الخمول",
        Fullbright          = "سطوع كامل",
        LanguageSelect      = "اللغة",
        LangNote            = "تغيير اللغة يتطلب إعادة التشغيل",
    },
    VI = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "bởi Rival960",
        TabHome             = "Trang Chủ",
        TabCombat           = "Chiến Đấu",
        TabMovement         = "Di Chuyển",
        TabTools            = "Công Cụ",
        CreditsTitle        = "Tín Dụng",
        CreditsContent      = "Tạo bởi Rival960 với sự trợ giúp của AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Cập Nhật Chiến Đấu",
        ReleaseNotesTitle   = "v1.1.1 — Ghi Chú Phiên Bản",
        ReleaseNotesContent = "Mới trong v1.1.0: Đạn Vô Hạn, Đóng Băng Đạn, sửa lỗi xuyên tường Aimbot, hệ thống hook đạn.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nTìm thấy lỗi hoặc muốn yêu cầu tính năng? Mở issue trên GitHub (Rival99900/Roblox-Scripts) hoặc đăng trên ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Tự Động Kéo",
        BringRadius         = "Bán Kính Kéo (studs)",
        BringInterval       = "Khoảng Thời Gian Kéo (s)",
        MaxZombieDist       = "Khoảng Cách Zombie Tối Đa",
        InfiniteAmmo        = "Đạn Vô Hạn",
        FreezeAmmo          = "Đóng Băng Đạn",
        FlyToggle           = "Bay",
        FlySpeed            = "Tốc Độ Bay",
        NoClip              = "NoClip",
        WalkSpeed           = "Tốc Độ Đi",
        InfJump             = "Nhảy Vô Hạn",
        AntiAFK             = "Chống AFK",
        Fullbright          = "Độ Sáng Tối Đa",
        LanguageSelect      = "Ngôn Ngữ",
        LangNote            = "Thay đổi ngôn ngữ cần khởi động lại",
    },
    SV = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "av Rival960",
        TabHome             = "Hem",
        TabCombat           = "Strid",
        TabMovement         = "Rörelse",
        TabTools            = "Verktyg",
        CreditsTitle        = "Erkännanden",
        CreditsContent      = "Skapad av Rival960 med hjälp av AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Stridsuppdatering",
        ReleaseNotesTitle   = "v1.1.1 — Versionsanteckningar",
        ReleaseNotesContent = "Nytt i v1.1.0: Oändlig Ammunition, Frys Ammunition, Aimbot väggenomträngningsfix, ammunition hook-system.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nHittade du en bugg eller vill begära en funktion? Öppna ett issue på GitHub (Rival99900/Roblox-Scripts) eller posta på ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Hämta",
        BringRadius         = "Hämtningsradie (studs)",
        BringInterval       = "Hämtningsintervall (s)",
        MaxZombieDist       = "Max Zombieavstånd",
        InfiniteAmmo        = "Oändlig Ammunition",
        FreezeAmmo          = "Frys Ammunition",
        FlyToggle           = "Flyg",
        FlySpeed            = "Flyghastighet",
        NoClip              = "NoClip",
        WalkSpeed           = "Gånghastighet",
        InfJump             = "Oändligt Hopp",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Full Ljusstyrka",
        LanguageSelect      = "Språk",
        LangNote            = "Språkändring kräver omstartning",
    },
    EL = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "από Rival960",
        TabHome             = "Αρχική",
        TabCombat           = "Μάχη",
        TabMovement         = "Κίνηση",
        TabTools            = "Εργαλεία",
        CreditsTitle        = "Εύσημα",
        CreditsContent      = "Δημιουργήθηκε από Rival960 με βοήθεια AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Ενημέρωση Μάχης",
        ReleaseNotesTitle   = "v1.1.1 — Σημειώσεις Έκδοσης",
        ReleaseNotesContent = "Νέο στο v1.1.0: Άπειρα Πυρομαχικά, Πάγωμα Πυρομαχικών, διόρθωση διαπέρασης τοίχων Aimbot, σύστημα hooks πυρομαχικών.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nΒρήκατε σφάλμα ή θέλετε να ζητήσετε λειτουργία; Ανοίξτε ένα issue στο GitHub (Rival99900/Roblox-Scripts) ή δημοσιεύστε στο ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Αυτόματη Έλξη",
        BringRadius         = "Ακτίνα Έλξης (studs)",
        BringInterval       = "Διάστημα Έλξης (s)",
        MaxZombieDist       = "Μέγ. Απόσταση Ζόμπι",
        InfiniteAmmo        = "Άπειρα Πυρομαχικά",
        FreezeAmmo          = "Πάγωμα Πυρομαχικών",
        FlyToggle           = "Πτήση",
        FlySpeed            = "Ταχύτητα Πτήσης",
        NoClip              = "NoClip",
        WalkSpeed           = "Ταχύτητα Βαδίσματος",
        InfJump             = "Άπειρο Άλμα",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Πλήρης Φωτεινότητα",
        LanguageSelect      = "Γλώσσα",
        LangNote            = "Η αλλαγή γλώσσας απαιτεί επανεκτέλεση",
    },
    RO = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "de Rival960",
        TabHome             = "Acasă",
        TabCombat           = "Luptă",
        TabMovement         = "Mișcare",
        TabTools            = "Instrumente",
        CreditsTitle        = "Credite",
        CreditsContent      = "Creat de Rival960 cu ajutorul AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Actualizare Luptă",
        ReleaseNotesTitle   = "v1.1.1 — Note de Lansare",
        ReleaseNotesContent = "Nou în v1.1.0: Muniție Infinită, Îngheță Muniție, corectare penetrare pereți Aimbot, sistem de hooks muniție.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nAți găsit un bug sau doriți să solicitați o funcție? Deschideți un issue pe GitHub (Rival99900/Roblox-Scripts) sau postați pe ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Atragere",
        BringRadius         = "Raza de Atragere (studs)",
        BringInterval       = "Interval Atragere (s)",
        MaxZombieDist       = "Dist. Maximă Zombie",
        InfiniteAmmo        = "Muniție Infinită",
        FreezeAmmo          = "Îngheță Muniție",
        FlyToggle           = "Zbor",
        FlySpeed            = "Viteză Zbor",
        NoClip              = "NoClip",
        WalkSpeed           = "Viteză Mers",
        InfJump             = "Salt Infinit",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Luminozitate Maximă",
        LanguageSelect      = "Limbă",
        LangNote            = "Schimbarea limbii necesită re-executare",
    },
    UK = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "від Rival960",
        TabHome             = "Головна",
        TabCombat           = "Бій",
        TabMovement         = "Рух",
        TabTools            = "Інструменти",
        CreditsTitle        = "Автори",
        CreditsContent      = "Створено Rival960 за допомогою AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Бойове Оновлення",
        ReleaseNotesTitle   = "v1.1.1 — Примітки до версії",
        ReleaseNotesContent = "Нове у v1.1.0: Нескінченні патрони, Заморозити патрони, виправлення проникнення крізь стіни аімбота, система хуків патронів.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nЗнайшли баг або хочете запропонувати функцію? Створіть issue на GitHub (Rival99900/Roblox-Scripts) або напишіть на ScriptBlox.",
        Aimbot              = "Аімбот",
        AutoBring           = "Авто Притягання",
        BringRadius         = "Радіус притягання (ст.)",
        BringInterval       = "Інтервал притягання (с)",
        MaxZombieDist       = "Макс дистанція зомбі",
        InfiniteAmmo        = "Нескінченні патрони",
        FreezeAmmo          = "Заморозити патрони",
        FlyToggle           = "Політ",
        FlySpeed            = "Швидкість польоту",
        NoClip              = "NoClip",
        WalkSpeed           = "Швидкість ходьби",
        InfJump             = "Нескінченний Стрибок",
        AntiAFK             = "Анти-АФК",
        Fullbright          = "Повна яскравість",
        LanguageSelect      = "Мова",
        LangNote            = "Зміна мови потребує перезапуску",
    },
    CS = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "od Rival960",
        TabHome             = "Domů",
        TabCombat           = "Boj",
        TabMovement         = "Pohyb",
        TabTools            = "Nástroje",
        CreditsTitle        = "Poděkování",
        CreditsContent      = "Vytvořeno Rival960 s pomocí AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Bojová Aktualizace",
        ReleaseNotesTitle   = "v1.1.1 — Poznámky k Vydání",
        ReleaseNotesContent = "Nové ve v1.1.0: Nekonečná Munice, Zmrazit Munici, oprava průniku zdmi Aimbot, systém háčků munice.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nNašli jste chybu nebo chcete požádat o funkci? Otevřete issue na GitHub (Rival99900/Roblox-Scripts) nebo přidejte příspěvek na ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Přitáhnout",
        BringRadius         = "Poloměr přitáhnutí (studs)",
        BringInterval       = "Interval přitáhnutí (s)",
        MaxZombieDist       = "Max vzdálenost zombie",
        InfiniteAmmo        = "Nekonečná Munice",
        FreezeAmmo          = "Zmrazit Munici",
        FlyToggle           = "Létání",
        FlySpeed            = "Rychlost letu",
        NoClip              = "NoClip",
        WalkSpeed           = "Rychlost chůze",
        InfJump             = "Nekonečný Skok",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Plný jas",
        LanguageSelect      = "Jazyk",
        LangNote            = "Změna jazyka vyžaduje restartování",
    },
    DA = {
        WindowTitle         = "Tower of Zombies Hub",
        WindowSubtitle      = "af Rival960",
        TabHome             = "Hjem",
        TabCombat           = "Kamp",
        TabMovement         = "Bevægelse",
        TabTools            = "Værktøjer",
        CreditsTitle        = "Anerkendelser",
        CreditsContent      = "Oprettet af Rival960 med hjælp fra AI\nGitHub: Rival99900 | Discord: rival960 | YouTube: rival9607\nv1.1.1 — Kampsopdatering",
        ReleaseNotesTitle   = "v1.1.1 — Udgivelsesnoter",
        ReleaseNotesContent = "Nyt i v1.1.0: Uendelig Ammunition, Frys Ammunition, Aimbot væggennemtrængningsfix, ammunition hook-system.\nv1.1.1: Executor compatibility fix — resolved game freeze on Volt and other executors.\nFandt du en fejl eller vil du anmode om en funktion? Åbn et issue på GitHub (Rival99900/Roblox-Scripts) eller post på ScriptBlox.",
        Aimbot              = "Aimbot",
        AutoBring           = "Auto Hent",
        BringRadius         = "Hentningsradius (studs)",
        BringInterval       = "Hentningsinterval (s)",
        MaxZombieDist       = "Maks Zombie Afstand",
        InfiniteAmmo        = "Uendelig Ammunition",
        FreezeAmmo          = "Frys Ammunition",
        FlyToggle           = "Fly",
        FlySpeed            = "Flyvehastighed",
        NoClip              = "NoClip",
        WalkSpeed           = "Gåhastighed",
        InfJump             = "Uendeligt Hop",
        AntiAFK             = "Anti-AFK",
        Fullbright          = "Fuld Lysstyrke",
        LanguageSelect      = "Sprog",
        LangNote            = "Sprogændring kræver genstart",
    },
}

local function T(key)
    local t = Translations[CurrentLang]
    if t and t[key] then return t[key] end
    return Translations["EN"][key] or key
end

-- ================================================================
-- Settings
-- ================================================================
local Settings = {
    Aimbot        = false,
    AutoBring     = false,
    BringRadius   = 3,
    BringInterval = 0.3,
    MaxZombieDist = 300,
    InfiniteAmmo  = false,
    FreezeAmmo    = false,
    Fly           = false,
    FlySpeed      = 60,
    NoClip        = false,
    WalkSpeed     = 16,
    InfJump       = false,
    AntiAFK       = false,
    Fullbright    = false,
}

-- Ammo state
local _frozenClip    = nil   -- cached clip value at FreezeAmmo toggle-ON time
local _frozenReserve = nil   -- cached reserve value at FreezeAmmo toggle-ON time
local CLIP_THRESHOLD = 99    -- write when value drops below this (weapon ClipSize)

-- Fire rate limiting
local lastFireTime  = 0
local FIRE_COOLDOWN = 0.08   -- 0.08s safe below the 0.18s minimum FinalFireRate

-- Aimbot lockout detection
local lastDamageTime = tick()  -- updated on every successful fireAtTarget call

-- Auto Bring connection (stored so it can be disconnected on toggle OFF)
local bringTimer    = 0
local autoBringConn = nil

-- ================================================================
-- Character helpers
-- ================================================================
local function getChar() return LocalPlayer.Character end
local function getHRP()
    local c = getChar()
    return c and c:FindFirstChild("HumanoidRootPart")
end
local function getHum()
    local c = getChar()
    return c and c:FindFirstChildOfClass("Humanoid")
end

-- ================================================================
-- Ammo helpers
-- ================================================================

-- Immediately write ammo values to the equipped tool's Info children
local function applyAmmoNow(clipVal, reserveVal)
    pcall(function()
        local char = LocalPlayer.Character
        if not char then return end
        local tool = char:FindFirstChildOfClass("Tool")
        if not tool then return end
        local info = tool:FindFirstChild("Info")
        if not info then return end
        local clip    = info:FindFirstChild("Clip")
        local reserve = info:FindFirstChild("Reserve")
        if clip    then clip.Value    = clipVal    end
        if reserve then reserve.Value = reserveVal end
    end)
end

-- ================================================================
-- forceHandlerAmmo — directly patch the Handler's internal upvalue
-- The Handler stores clip count internally (upvalue ~[40] in FireGun closure).
-- When this internal counter hits 0 it calls BeginReload, blocking all shots.
-- Writing Info.Clip.Value alone does NOT update that counter.
-- ================================================================
local function forceHandlerAmmo(tool, targetValue)
    if not tool then return end
    local handler = tool:FindFirstChildOfClass("LocalScript")
               or  tool:FindFirstChild("Handler")
    if not handler then return end
    pcall(function()
        local info    = tool:FindFirstChild("Info")
        local clipObj = info and info:FindFirstChild("Clip")
        if not clipObj then return end
        local currentClip = clipObj.Value
        if debug and debug.getupvalue and debug.setupvalue then
            for i = 1, 80 do
                pcall(function()
                    local _, val = debug.getupvalue(handler, i)
                    if type(val) == "number"
                    and val >= 0
                    and val <= 10000
                    and math.floor(val) == math.floor(currentClip) then
                        debug.setupvalue(handler, i, targetValue)
                    end
                end)
            end
        end
    end)
end

-- ================================================================
-- softReequip — reset Handler state by moving tool through backpack
-- Called automatically when aimbot lockout (>3s without a successful shot) is detected.
-- After re-equip, immediately re-applies the active ammo mode.
-- ================================================================
local function softReequip()
    pcall(function()
        local char    = LocalPlayer.Character
        if not char then return end
        local tool    = char:FindFirstChildOfClass("Tool")
        if not tool then return end
        local backpack = LocalPlayer:FindFirstChild("Backpack")
        if not backpack then return end
        tool.Parent = backpack
        task.wait(0.1)
        tool.Parent = char
        -- Re-apply ammo immediately after re-equip
        task.wait(0.05)
        if Settings.InfiniteAmmo then
            applyAmmoNow(99999, 99999)
        elseif Settings.FreezeAmmo and _frozenClip then
            applyAmmoNow(_frozenClip, _frozenReserve or 99999)
        end
    end)
end

-- ================================================================
-- Rayfield load (keyless) — wrapped in pcall to prevent freeze on
-- slow CDN or unsupported executors.
-- ================================================================
local ok, Rayfield = pcall(function()
    return loadstring(game:HttpGet("https://sirius.menu/rayfield"))()
end)
if not ok or not Rayfield then
    warn("[Hub] Rayfield failed to load")
    return
end

local Window = Rayfield:CreateWindow({
    Name             = T("WindowTitle"),
    LoadingTitle     = T("WindowTitle"),
    LoadingSubtitle  = T("WindowSubtitle"),
    ConfigurationSaving = { Enabled = false },
    Discord          = { Enabled = false },
    KeySystem        = false,
})

-- ================================================================
-- Shared combat helpers
-- ================================================================

local function getClosestZombieTarget(maxDist)
    local hrp = getHRP()
    if not hrp then return nil end
    local bestPart, bestDist = nil, maxDist
    local zombieFolder = workspace:FindFirstChild("ActiveZombies")
    if not zombieFolder then return nil end
    for _, zombie in ipairs(zombieFolder:GetChildren()) do
        local hum = zombie:FindFirstChildOfClass("Humanoid")
        if hum and hum.Health > 0 then
            local zhrp = zombie:FindFirstChild("HumanoidRootPart")
            if zhrp then
                local dist = (zhrp.Position - hrp.Position).Magnitude
                if dist < bestDist then
                    bestDist = dist
                    bestPart = zombie:FindFirstChild("HeadHitbox")
                           or zombie:FindFirstChild("Head")
                           or zhrp
                end
            end
        end
    end
    return bestPart
end

-- Fire both remotes with epsilon rayOrigin + 0.08s rate limiter.
-- Returns true when at least one fire call succeeded (used for lockout tracking).
local function fireAtTarget(targetPart)
    local now = tick()
    if (now - lastFireTime) < FIRE_COOLDOWN then return false end
    lastFireTime = now

    local char = LocalPlayer.Character
    if not char then return false end
    local tool = char:FindFirstChildOfClass("Tool")
    if not tool then return false end
    local weaponName = tool.Name
    local exitPart   = tool:FindFirstChild("Exit")
    if not exitPart then return false end

    -- Ensure ammo is non-zero before firing
    pcall(function()
        local info = tool:FindFirstChild("Info")
        if info then
            local clip    = info:FindFirstChild("Clip")
            local reserve = info:FindFirstChild("Reserve")
            if clip    and clip.Value    < 1 then clip.Value    = 99999 end
            if reserve and reserve.Value < 1 then reserve.Value = 99999 end
        end
    end)

    local hitPos    = targetPart.Position
    local rayOrigin = hitPos + Vector3.new(0, 0.01, 0)
    local normalVec = Vector3.new(0, 1, 0)

    -- Clear weapon debounce state before firing
    pcall(function() tool:SetAttribute("Firing", false) end)
    pcall(function() tool:SetAttribute("ContinuousFireActive", false) end)

    local fired = false
    pcall(function()
        ReplicatedStorage.Events.Actions.Fire:FireServer(
            weaponName,
            {{ targetPart, hitPos, normalVec }},
            {{ weaponName, rayOrigin, hitPos, hitPos, true, targetPart, false, false, "Default", exitPart }}
        )
        fired = true
    end)
    pcall(function()
        ReplicatedStorage.Events.Actions.Fire_2:FireServer(
            weaponName,
            {{ targetPart, hitPos, normalVec }},
            {{ weaponName, rayOrigin, hitPos, hitPos, true, targetPart, false, false, "Default", exitPart }}
        )
        fired = true
    end)

    if fired then
        lastDamageTime = tick()
    end
    return fired
end

-- ================================================================
-- TABS
-- ================================================================

local HomeTab = Window:CreateTab(T("TabHome"), 4483362458)
HomeTab:CreateParagraph({
    Title   = T("CreditsTitle"),
    Content = T("CreditsContent"),
})
HomeTab:CreateParagraph({
    Title   = T("ReleaseNotesTitle"),
    Content = T("ReleaseNotesContent"),
})

local CombatTab = Window:CreateTab(T("TabCombat"), 4483362458)

CombatTab:CreateToggle({
    Name         = T("Aimbot"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.Aimbot = val
        if val then
            lastDamageTime = tick()  -- reset lockout timer on enable
        end
    end,
})

CombatTab:CreateSlider({
    Name         = T("MaxZombieDist"),
    Range        = {50, 500},
    Increment    = 10,
    CurrentValue = 300,
    Callback     = function(val) Settings.MaxZombieDist = val end,
})

CombatTab:CreateToggle({
    Name         = T("AutoBring"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.AutoBring = val
        if val then
            bringTimer = 0
            -- Connect Heartbeat for AutoBring (store so we can disconnect later)
            if autoBringConn then autoBringConn:Disconnect() end
            autoBringConn = RunService.Heartbeat:Connect(function(dt)
                if not Settings.AutoBring then return end
                bringTimer = bringTimer + dt
                if bringTimer < Settings.BringInterval then return end
                bringTimer = 0
                task.spawn(function()
                    pcall(function()
                        local hrp = getHRP()
                        if not hrp then return end
                        local zombieFolder = workspace:FindFirstChild("ActiveZombies")
                        if not zombieFolder then return end

                        local zombies = zombieFolder:GetChildren()
                        local total   = #zombies
                        if total == 0 then return end

                        for i, zombie in ipairs(zombies) do
                            local hum = zombie:FindFirstChildOfClass("Humanoid")
                            if hum and hum.Health > 0 then
                                local zhrp = zombie:FindFirstChild("HumanoidRootPart")
                                if zhrp then
                                    local angle  = ((i - 1) / total) * (2 * math.pi)
                                    local offset = Vector3.new(
                                        math.cos(angle), 0, math.sin(angle)
                                    ) * Settings.BringRadius
                                    pcall(function()
                                        zhrp.CFrame   = CFrame.new(hrp.Position + offset)
                                        hum.WalkSpeed = 0
                                    end)
                                    if Settings.Aimbot then
                                        local target = zombie:FindFirstChild("HeadHitbox")
                                                    or zombie:FindFirstChild("Head")
                                                    or zhrp
                                        task.spawn(function() fireAtTarget(target) end)
                                    end
                                    task.wait(0.01)
                                end
                            end
                        end
                    end)
                end)
            end)
        else
            -- Disconnect Heartbeat to avoid leaked connection
            if autoBringConn then
                autoBringConn:Disconnect()
                autoBringConn = nil
            end
            bringTimer = 0
            pcall(function()
                local zombieFolder = workspace:FindFirstChild("ActiveZombies")
                if not zombieFolder then return end
                for _, zombie in ipairs(zombieFolder:GetChildren()) do
                    local hum = zombie:FindFirstChildOfClass("Humanoid")
                    if hum then hum.WalkSpeed = 16 end
                end
            end)
        end
    end,
})

CombatTab:CreateSlider({
    Name         = T("BringRadius"),
    Range        = {1, 10},
    Increment    = 1,
    CurrentValue = 3,
    Callback     = function(val) Settings.BringRadius = val end,
})

CombatTab:CreateSlider({
    Name         = T("BringInterval"),
    Range        = {0.1, 2.0},
    Increment    = 0.1,
    CurrentValue = 0.3,
    Callback     = function(val) Settings.BringInterval = val end,
})

CombatTab:CreateToggle({
    Name         = T("InfiniteAmmo"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.InfiniteAmmo = val
        if val then
            Settings.FreezeAmmo = false
            _frozenClip    = nil
            _frozenReserve = nil
            -- Apply immediately, before the next loop tick
            applyAmmoNow(99999, 99999)
        end
    end,
})

CombatTab:CreateToggle({
    Name         = T("FreezeAmmo"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.FreezeAmmo = val
        if val then
            Settings.InfiniteAmmo = false
            -- Cache current values immediately at toggle-ON time
            pcall(function()
                local char = LocalPlayer.Character
                local tool = char and char:FindFirstChildOfClass("Tool")
                if tool then
                    local info = tool:FindFirstChild("Info")
                    if info then
                        local clip    = info:FindFirstChild("Clip")
                        local reserve = info:FindFirstChild("Reserve")
                        -- If clip is already 0, freeze at ClipSize (12) instead
                        local cv = clip    and clip.Value    or 12
                        local rv = reserve and reserve.Value or 99999
                        _frozenClip    = (cv > 0) and cv or 12
                        _frozenReserve = (rv > 0) and rv or 99999
                    end
                end
            end)
            -- Apply immediately
            if _frozenClip then
                applyAmmoNow(_frozenClip, _frozenReserve or 99999)
            end
        else
            _frozenClip    = nil
            _frozenReserve = nil
        end
    end,
})

-- ───── Tab 3: Movement ─────
local MovementTab = Window:CreateTab(T("TabMovement"), 4483362458)

-- ================================================================
-- Fly system (confirmed working — do not touch logic)
-- ================================================================
local FLYING       = false
local FLY_BTN_UP   = 0
local FLY_BTN_DOWN = 0
local flyKeyDown, flyKeyUp
local _flyUpBtn, _flyDownBtn

local function enableFly()
    local char = getChar()
    local hrp  = getHRP()
    local hum  = getHum()
    if not char or not hrp or not hum then return end

    if flyKeyDown then flyKeyDown:Disconnect() end
    if flyKeyUp   then flyKeyUp:Disconnect()   end

    FLYING = true

    local CTRL = {F=0, B=0, L=0, R=0, UP=0, DOWN=0}

    -- Wrap deprecated Instance.new calls in pcall for executor compatibility
    local bv, bg
    pcall(function()
        bv = Instance.new("BodyVelocity")
        bv.Name      = "_SWAT_FLY_BV"
        bv.MaxForce  = Vector3.new(9e9, 9e9, 9e9)
        bv.Velocity  = Vector3.zero
        bv.Parent    = hrp
    end)
    pcall(function()
        bg = Instance.new("BodyGyro")
        bg.Name      = "_SWAT_FLY_BG"
        bg.P         = 9e4
        bg.MaxTorque = Vector3.new(9e9, 9e9, 9e9)
        bg.CFrame    = hrp.CFrame
        bg.Parent    = hrp
    end)
    if not bv or not bg then FLYING = false return end

    hum.PlatformStand = true

    flyKeyDown = UserInputService.InputBegan:Connect(function(inp, proc)
        if proc then return end
        local k = inp.KeyCode
        if     k == Enum.KeyCode.W          then CTRL.F    =  1
        elseif k == Enum.KeyCode.S          then CTRL.B    = -1
        elseif k == Enum.KeyCode.A          then CTRL.L    = -1
        elseif k == Enum.KeyCode.D          then CTRL.R    =  1
        elseif k == Enum.KeyCode.Space      then CTRL.UP   =  1
        elseif k == Enum.KeyCode.LeftShift
            or k == Enum.KeyCode.RightShift then CTRL.DOWN = -1
        end
    end)

    flyKeyUp = UserInputService.InputEnded:Connect(function(inp, proc)
        if proc then return end
        local k = inp.KeyCode
        if     k == Enum.KeyCode.W          then CTRL.F    = 0
        elseif k == Enum.KeyCode.S          then CTRL.B    = 0
        elseif k == Enum.KeyCode.A          then CTRL.L    = 0
        elseif k == Enum.KeyCode.D          then CTRL.R    = 0
        elseif k == Enum.KeyCode.Space      then CTRL.UP   = 0
        elseif k == Enum.KeyCode.LeftShift
            or k == Enum.KeyCode.RightShift then CTRL.DOWN = 0
        end
    end)

    if _flyUpBtn   then _flyUpBtn.Visible   = true end
    if _flyDownBtn then _flyDownBtn.Visible = true end

    task.spawn(function()
        while FLYING do
            task.wait()
            local camCF    = workspace.CurrentCamera.CFrame
            local rawLook  = camCF.LookVector
            local rawRight = camCF.RightVector
            local spd      = Settings.FlySpeed

            local flatLook  = Vector3.new(rawLook.X,  0, rawLook.Z)
            local flatRight = Vector3.new(rawRight.X, 0, rawRight.Z)
            if flatLook.Magnitude  > 0 then flatLook  = flatLook.Unit  end
            if flatRight.Magnitude > 0 then flatRight = flatRight.Unit end

            local pcVel = flatLook  * CTRL.F
                        + flatLook  * CTRL.B
                        + flatRight * CTRL.R
                        + flatRight * CTRL.L

            local md        = hum.MoveDirection
            local mobileVel = Vector3.new(md.X, 0, md.Z)

            local horizVel
            if md.Magnitude > 0.1 then
                horizVel = mobileVel * spd
            else
                horizVel = pcVel * spd
            end

            local vertVel = Vector3.new(0, (CTRL.UP + CTRL.DOWN + FLY_BTN_UP + FLY_BTN_DOWN) * spd, 0)
            bv.Velocity = horizVel + vertVel
            bg.CFrame   = camCF
        end
    end)
end

local function disableFly()
    FLYING = false
    FLY_BTN_UP   = 0
    FLY_BTN_DOWN = 0
    if flyKeyDown then flyKeyDown:Disconnect(); flyKeyDown = nil end
    if flyKeyUp   then flyKeyUp:Disconnect();   flyKeyUp   = nil end
    local hrp = getHRP()
    if hrp then
        local b = hrp:FindFirstChild("_SWAT_FLY_BV"); if b then b:Destroy() end
        local g = hrp:FindFirstChild("_SWAT_FLY_BG"); if g then g:Destroy() end
    end
    local h = getHum()
    if h then h.PlatformStand = false end
    if _flyUpBtn   then _flyUpBtn.Visible   = false end
    if _flyDownBtn then _flyDownBtn.Visible = false end
end

-- Mobile ▲▼ buttons
if UserInputService.TouchEnabled then
    local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
    if playerGui then
        local flyGui = Instance.new("ScreenGui")
        flyGui.Name           = "TozFlyOverlay"
        flyGui.ResetOnSpawn   = false
        flyGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
        flyGui.Parent         = playerGui

        local BTN = 60
        local GAP = 8

        local function makeBtn(text, xOffset)
            local btn = Instance.new("TextButton")
            btn.Size                   = UDim2.new(0, BTN, 0, BTN)
            btn.Position               = UDim2.new(0.5, xOffset, 1, -(BTN + 20))
            btn.AnchorPoint            = Vector2.new(0, 0)
            btn.BackgroundColor3       = Color3.fromRGB(40, 40, 40)
            btn.BackgroundTransparency = 0.3
            btn.TextColor3             = Color3.new(1, 1, 1)
            btn.Text                   = text
            btn.TextScaled             = true
            btn.Font                   = Enum.Font.GothamBold
            btn.Visible                = false
            btn.Parent                 = flyGui
            local corner = Instance.new("UICorner")
            corner.CornerRadius = UDim.new(0, 10)
            corner.Parent       = btn
            return btn
        end

        _flyUpBtn   = makeBtn("▲", -(BTN + GAP / 2))
        _flyDownBtn = makeBtn("▼",   GAP / 2)

        _flyUpBtn.InputBegan:Connect(function(i)
            if i.UserInputType == Enum.UserInputType.Touch then FLY_BTN_UP = 1 end
        end)
        _flyUpBtn.InputEnded:Connect(function(i)
            if i.UserInputType == Enum.UserInputType.Touch then FLY_BTN_UP = 0 end
        end)
        _flyDownBtn.InputBegan:Connect(function(i)
            if i.UserInputType == Enum.UserInputType.Touch then FLY_BTN_DOWN = -1 end
        end)
        _flyDownBtn.InputEnded:Connect(function(i)
            if i.UserInputType == Enum.UserInputType.Touch then FLY_BTN_DOWN = 0 end
        end)
    end
end

MovementTab:CreateToggle({
    Name         = T("FlyToggle"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.Fly = val
        if val then enableFly() else disableFly() end
    end,
})

MovementTab:CreateSlider({
    Name         = T("FlySpeed"),
    Range        = {10, 300},
    Increment    = 5,
    CurrentValue = 60,
    Callback     = function(val) Settings.FlySpeed = val end,
})

local noClipConn
MovementTab:CreateToggle({
    Name         = T("NoClip"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.NoClip = val
        if val then
            if not noClipConn then
                noClipConn = RunService.Stepped:Connect(function()
                    if not Settings.NoClip then
                        noClipConn:Disconnect()
                        noClipConn = nil
                        return
                    end
                    pcall(function()
                        local char = getChar()
                        if not char then return end
                        for _, p in ipairs(char:GetDescendants()) do
                            if p:IsA("BasePart") then p.CanCollide = false end
                        end
                    end)
                end)
            end
        else
            if noClipConn then noClipConn:Disconnect() noClipConn = nil end
        end
    end,
})

MovementTab:CreateSlider({
    Name         = T("WalkSpeed"),
    Range        = {16, 250},
    Increment    = 1,
    CurrentValue = 16,
    Callback     = function(val)
        Settings.WalkSpeed = val
        pcall(function()
            local hum = getHum()
            if hum then hum.WalkSpeed = val end
        end)
    end,
})

MovementTab:CreateToggle({
    Name         = T("InfJump"),
    CurrentValue = false,
    Callback     = function(val) Settings.InfJump = val end,
})

local ToolsTab = Window:CreateTab(T("TabTools"), 4483362458)

ToolsTab:CreateToggle({
    Name         = T("Fullbright"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.Fullbright = val
        pcall(function()
            local lighting = game:GetService("Lighting")
            if val then
                lighting.Brightness    = 10
                lighting.GlobalShadows = false
                lighting.ClockTime     = 14
            else
                lighting.Brightness    = 1
                lighting.GlobalShadows = true
                lighting.ClockTime     = 14
            end
        end)
    end,
})

local afkThread
ToolsTab:CreateToggle({
    Name         = T("AntiAFK"),
    CurrentValue = false,
    Callback     = function(val)
        Settings.AntiAFK = val
        if val then
            if not afkThread then
                afkThread = task.spawn(function()
                    while Settings.AntiAFK do
                        pcall(function()
                            local hrp = getHRP()
                            if hrp then
                                hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(0.01), 0)
                            end
                        end)
                        task.wait(60)
                    end
                    afkThread = nil
                end)
            end
        end
    end,
})

ToolsTab:CreateDropdown({
    Name          = T("LanguageSelect"),
    Options       = {"EN","FR","DE","ES","PT","RU","IT","NL","PL","ZH","JA","TR","KO","AR","VI","SV","EL","RO","UK","CS","DA"},
    CurrentOption = {"EN"},
    Callback      = function(opt)
        CurrentLang = type(opt) == "table" and opt[1] or opt
    end,
})

ToolsTab:CreateLabel(T("LangNote"))

-- ================================================================
-- Ammo maintenance loop — 0.05s interval
-- Threshold-based: only writes when value < CLIP_THRESHOLD (99).
-- InfiniteAmmo takes priority over FreezeAmmo when both are ON.
-- After writing Info values, also patches Handler's internal upvalue.
-- ================================================================
task.spawn(function()
    while true do
        task.wait(0.05)
        pcall(function()
            local char = LocalPlayer.Character
            if not char then return end
            local tool = char:FindFirstChildOfClass("Tool")
            if not tool then return end
            local info = tool:FindFirstChild("Info")
            if not info then return end
            local clip    = info:FindFirstChild("Clip")
            local reserve = info:FindFirstChild("Reserve")

            if Settings.InfiniteAmmo then
                local wrote = false
                if clip    and clip.Value    < CLIP_THRESHOLD then clip.Value    = 99999; wrote = true end
                if reserve and reserve.Value < CLIP_THRESHOLD then reserve.Value = 99999; wrote = true end
                if wrote then forceHandlerAmmo(tool, 99999) end

            elseif Settings.FreezeAmmo and _frozenClip then
                local cv = _frozenClip
                local rv = _frozenReserve or 99999
                local wrote = false
                if clip    and clip.Value    ~= cv then clip.Value    = cv; wrote = true end
                if reserve and reserve.Value ~= rv then reserve.Value = rv; wrote = true end
                if wrote and cv > 0 then forceHandlerAmmo(tool, cv) end
            end
        end)
    end
end)

-- ================================================================
-- Lockout watchdog — checks every 0.5s whether aimbot has gone
-- 3s without a successful shot, and triggers a soft re-equip if so.
-- ================================================================
task.spawn(function()
    while true do
        task.wait(0.5)
        if Settings.Aimbot and (tick() - lastDamageTime) > 3 then
            -- Only attempt re-equip if we actually have a target (not just idle)
            local target = getClosestZombieTarget(Settings.MaxZombieDist)
            if target then
                softReequip()
                lastDamageTime = tick()  -- reset after re-equip attempt
            end
        end
    end
end)

-- ================================================================
-- Main Loops
-- ================================================================

local aimbotConn
local function connectAimbot()
    if aimbotConn then aimbotConn:Disconnect() end
    aimbotConn = RunService.RenderStepped:Connect(function()
        if not Settings.Aimbot then return end
        pcall(function()
            local cam        = workspace.CurrentCamera
            local targetPart = getClosestZombieTarget(Settings.MaxZombieDist)
            if targetPart then
                cam.CFrame = CFrame.lookAt(cam.CFrame.Position, targetPart.Position)
            end
        end)
    end)
end
connectAimbot()
LocalPlayer.CharacterAdded:Connect(function()
    connectAimbot()
    lastDamageTime = tick()
end)

UserInputService.JumpRequest:Connect(function()
    if not Settings.InfJump then return end
    pcall(function()
        local hum = getHum()
        if hum then hum:ChangeState(Enum.HumanoidStateType.Jumping) end
    end)
end)

pcall(function()
    ReplicatedStorage.Events.Communication.LavaRising.OnClientEvent:Connect(function()
        Rayfield:Notify({
            Title    = "⚠️ Lava Rising!",
            Content  = "Lava is rising — climb fast!",
            Duration = 4,
            Image    = 4483362458,
        })
    end)
end)
Game pageTower of Zombies · 1 script on this siteRoblox ›

More Tower of Zombies scripts

See all
Get Delta Script first on GoogleAdd us as a preferred source to see our new scripts in your Google results.
Add Delta Script on Google

Leave a Reply

Your email address will not be published. Required fields are marked *