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


-- =========================================================
-- KITTEN HUB V6 (BRING ITEMS TO PLAYER ENGINE)
-- 
-- КАК ЭТО РАБОТАЕТ (ПРИНЦИП ДЕЙСТВИЯ):
-- 1. Скрипт находит объекты в Workspace (монеты, рыбу и т.д.).
-- 2. Если объект незаанкерен (Anchored = false) и у клиента есть 
--    сетевое владение (Network Ownership), изменение его CFrame 
--    перемещает физический объект прямо к вашему персонажу.
-- 3. Если объект заанкерен (Anchored = true), изменение CFrame на клиенте
--    сработает визуально, поэтому скрипт также вызывает firetouchinterest
--    для симуляции контакта прямо на месте персонажа.
-- =========================================================

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

-- Очистка предыдущего интерфейса
local oldGui = LocalPlayer:WaitForChild("PlayerGui"):FindFirstChild("KittenHubBringGUI")
if oldGui then oldGui:Destroy() end

local state = {
    BringCoins = true,
    BringFish = true,
    BringMiniChests = true,
    ScriptRunning = true
}

-- =========================================================
-- ИНТЕРФЕЙС (GUI)
-- =========================================================

local gui = Instance.new("ScreenGui")
gui.Name = "KittenHubBringGUI"
gui.ResetOnSpawn = false
gui.Parent = LocalPlayer:WaitForChild("PlayerGui")

local mainFrame = Instance.new("Frame")
mainFrame.Name = "MainFrame"
mainFrame.Size = UDim2.new(0, 250, 0, 320)
mainFrame.Position = UDim2.new(0.03, 0, 0.2, 0)
mainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 25)
mainFrame.BorderSizePixel = 0
mainFrame.Active = true
mainFrame.Draggable = true
mainFrame.Parent = gui

local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 8)
corner.Parent = mainFrame

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 38)
title.BackgroundColor3 = Color3.fromRGB(30, 30, 40)
title.Text = "ITEM BRING HUB V6"
title.TextColor3 = Color3.fromRGB(255, 255, 255)
title.Font = Enum.Font.SourceSansBold
title.TextSize = 15
title.Parent = mainFrame

local titleCorner = Instance.new("UICorner")
titleCorner.CornerRadius = UDim.new(0, 8)
titleCorner.Parent = title

local container = Instance.new("Frame")
container.Size = UDim2.new(0.9, 0, 0.8, 0)
container.Position = UDim2.new(0.05, 0, 0.15, 0)
container.BackgroundTransparency = 1
container.Parent = mainFrame

local UIListLayout = Instance.new("UIListLayout")
UIListLayout.Parent = container
UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder
UIListLayout.Padding = UDim.new(0, 6)

local function createToggle(name, stateKey)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(1, 0, 0, 34)
    btn.BackgroundColor3 = state[stateKey] and Color3.fromRGB(45, 130, 65) or Color3.fromRGB(38, 38, 42)
    btn.Text = name .. (state[stateKey] and ": ВКЛ" or ": ВЫКЛ")
    btn.TextColor3 = Color3.fromRGB(255, 255, 255)
    btn.Font = Enum.Font.SourceSansBold
    btn.TextSize = 13
    btn.Parent = container

    local btnCorner = Instance.new("UICorner")
    btnCorner.CornerRadius = UDim.new(0, 6)
    btnCorner.Parent = btn

    btn.MouseButton1Click:Connect(function()
        state[stateKey] = not state[stateKey]
        btn.BackgroundColor3 = state[stateKey] and Color3.fromRGB(45, 130, 65) or Color3.fromRGB(38, 38, 42)
        btn.Text = name .. (state[stateKey] and ": ВКЛ" or ": ВЫКЛ")
    end)
end

createToggle("Главный Переключатель", "ScriptRunning")
createToggle("Притягивать Монеты", "BringCoins")
createToggle("Притягивать Рыбу", "BringFish")
createToggle("Притягивать Мини-Сундуки", "BringMiniChests")

-- =========================================================
-- ЛОГИКА ПЕРЕМЕЩЕНИЯ ОБЪЕКТОВ К ИГРОКУ
-- =========================================================

local function getRoot()
    local char = LocalPlayer.Character
    return char and char:FindFirstChild("HumanoidRootPart")
end

local function bringToPlayer(target)
    if not state.ScriptRunning or not target then return end
    
    local root = getRoot()
    if not root then return end

    local part = target:IsA("BasePart") and target or target:FindFirstChildWhichIsA("BasePart", true)
    
    if part then
        -- Внимание: Если объект незаанкерен, телепортируем его к себе
        pcall(function()
            part.CanCollide = false
            part.CFrame = root.CFrame * CFrame.new(0, 0, -1)
            
            -- Вызов TouchInterest для регистрации подбора сервером
            if firetouchinterest then
                firetouchinterest(root, part, 0)
                task.wait(0.01)
                firetouchinterest(root, part, 1)
            end
        end)
    end
end

-- Цикл телепортации предметов к игроку
task.spawn(function()
    while true do
        if state.ScriptRunning then
            -- 1. Монеты
            if state.BringCoins then
                local coinSpawner = Workspace:FindFirstChild("CoinSpawner")
                if coinSpawner then
                    for _, coin in ipairs(coinSpawner:GetChildren()) do
                        if not state.BringCoins or not state.ScriptRunning then break end
                        if coin.Name == "Coin" then
                            bringToPlayer(coin)
                        end
                    end
                end
            end

            -- 2. Рыба
            if state.BringFish then
                local fishAssets = Workspace:FindFirstChild("FishAssets")
                local spawnedFish = fishAssets and fishAssets:FindFirstChild("SpawnedFish")
                if spawnedFish then
                    for _, fish in ipairs(spawnedFish:GetChildren()) do
                        if not state.BringFish or not state.ScriptRunning then break end
                        bringToPlayer(fish)
                    end
                end
            end

            -- 3. Мини-сундуки
            if state.BringMiniChests then
                for _, obj in ipairs(Workspace:GetDescendants()) do
                    if not state.BringMiniChests or not state.ScriptRunning then break end
                    if obj.Parent and obj.Parent.Name == "MiniChests" or obj.Name:find("MiniChest_") then
                        bringToPlayer(obj)
                    end
                end
            end
        end
        task.wait(0.2)
    end
end)