Загрузка данных


-- // BoatHelper | Premium Script
-- // Создано для Roblox

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

-- // Функции, которые будут отключаться при уничтожении GUI
local ActiveFunctions = {
    ESP = {
        Enabled = false,
        Connection = nil,
        PlayersData = {},
        Name = "ESP Игроков",
        Description = "Подсвечивает игроков через стены. Красный - Knife, Синий - Dodge, Белый - ничего."
    },
    Aimbot = {
        Enabled = false,
        Connection = nil,
        IgnoredPlayers = {},
        AimMode = "Closest",
        Name = "Aimbot",
        Description = "Автоматически наводится на игрока. Режимы: Ближайший или По взгляду."
    },
    BallsESP = {
        Enabled = false,
        Connection = nil,
        BallsData = {},
        Name = "ESP Шариков",
        Description = "Подсвечивает упавшие шарики желтым цветом."
    }
}

-- // Окно выбора игроков для игнорирования
local IgnoreListFrame = nil

-- // Функция проверки инвентаря игрока
local function CheckPlayerInventory(player)
    local hasKnife = false
    local hasDodge = false
    
    local backpack = player:FindFirstChild("Backpack")
    if backpack then
        for _, item in pairs(backpack:GetChildren()) do
            local itemName = item.Name:lower()
            if itemName:find("knife") or itemName:find("нож") then
                hasKnife = true
            end
            if itemName:find("dodge") or itemName:find("уклон") then
                hasDodge = true
            end
        end
    end
    
    local character = player.Character
    if character then
        for _, item in pairs(character:GetChildren()) do
            if item:IsA("Tool") then
                local itemName = item.Name:lower()
                if itemName:find("knife") or itemName:find("нож") then
                    hasKnife = true
                end
                if itemName:find("dodge") or itemName:find("уклон") then
                    hasDodge = true
                end
            end
        end
    end
    
    return hasKnife, hasDodge
end

-- // Функция поиска шариков (оптимизированная)
local function FindBalls()
    local balls = {}
    local foundBalls = {}
    
    -- Ищем только в определенных местах, где могут быть шарики
    local searchLocations = {
        Workspace,
        Workspace:FindFirstChild("Balls"),
        Workspace:FindFirstChild("Items"),
        Workspace:FindFirstChild("Drops"),
        Workspace:FindFirstChild("Loot")
    }
    
    for _, location in pairs(searchLocations) do
        if location then
            local descendants = location:GetDescendants()
            for _, object in pairs(descendants) do
                if object:IsA("BasePart") and not object.Anchored then
                    local objectName = object.Name:lower()
                    if objectName:find("ball") 
                        or objectName:find("orb") 
                        or objectName:find("sphere")
                        or objectName:find("шар")
                        or objectName:find("мяч") then
                        
                        -- Проверяем, что шарик упал (низко)
                        if object.Position.Y < 20 and not foundBalls[object] then
                            table.insert(balls, object)
                            foundBalls[object] = true
                        end
                    end
                end
            end
        end
    end
    
    return balls
end

-- // Очистка ESP для конкретного игрока
local function CleanupPlayerESP(player)
    local data = ActiveFunctions.ESP.PlayersData[player]
    if not data then return end
    
    if data.Highlight then
        data.Highlight:Destroy()
        data.Highlight = nil
    end
    
    if data.Billboard then
        data.Billboard:Destroy()
        data.Billboard = nil
    end
    
    if data.UpdateConnection then
        data.UpdateConnection:Disconnect()
        data.UpdateConnection = nil
    end
    
    if data.CharacterConnection then
        data.Character