GUI[SOURCE]
Key Required

GUI[SOURCE]

[🐰] Refinery Caves 2 True_GamerTrue_Gamer 33.8K views 312 executesUpdated Oct 29, 2024
4.0/ 5(5 votes)
4180% Positive
Lua Script•1524 lines (54981 chars)
local Rayfield = loadstring(game:HttpGet('https://sirius.menu/rayfield'))()

local Window = Rayfield:CreateWindow({
   Name = "RC2 Remake",
   Icon = 0, -- Icon in Topbar. Can use Lucide Icons (string) or Roblox Image (number). 0 to use no icon (default).
   LoadingTitle = "Rayfield Interface Suite",
   LoadingSubtitle = "by Sirius",
   ShowText = "Rayfield", -- for mobile users to unhide rayfield, change if you'd like
   Theme = "Default", -- Check https://docs.sirius.menu/rayfield/configuration/themes

   ToggleUIKeybind = "K", -- The keybind to toggle the UI visibility (string like "K" or Enum.KeyCode)

   DisableRayfieldPrompts = false,
   DisableBuildWarnings = false, -- Prevents Rayfield from warning when the script has a version mismatch with the interface

   ConfigurationSaving = {
      Enabled = true,
      FolderName = nil, -- Create a custom folder for your hub/game
      FileName = "RC2 Remake"
   },

   Discord = {
      Enabled = false, -- Prompt the user to join your Discord server if their executor supports it
      Invite = "noinvitelink", -- The Discord invite code, do not include discord.gg/. E.g. discord.gg/ ABCD would be ABCD
      RememberJoins = true -- Set this to false to make them join the discord every time they load it up
   },

   KeySystem = false, -- Set this to true to use our key system
   KeySettings = {
      Title = "Untitled",
      Subtitle = "Key System",
      Note = "No method of obtaining the key is provided", -- Use this to tell the user how to get a key
      FileName = "Key", -- It is recommended to use something unique as other scripts using Rayfield may overwrite your key file
      SaveKey = true, -- The user's key will be saved, but if you change the key, they will be unable to use your script
      GrabKeyFromSite = false, -- If this is true, set Key below to the RAW site you would like Rayfield to get the key from
      Key = {"Hello"} -- List of keys that will be accepted by the system, can be RAW file links (pastebin, github etc) or simple strings ("hello","key22")
   }
})

Rayfield:Notify({
    Title = "Game Version/info",
    Content = "This was made for beta V.18. You may want to change keybind to open on settings.",
    Duration = 6.5,
    Image = "info",
 })



 local currentTime = os.time()  -- Get the current time in seconds since epoch
local currentDate = os.date("*t", currentTime)  -- Convert to table for easier manipulation

-- Check if today is December 25th
if currentDate.month == 12 and currentDate.day == 25 then
    -- Show Christmas notification using Rayfield UI
    Rayfield:Notify({
        Title = "Merry Christmas! 🎄",
        Content = "Wishing you a joyful and festive day! 🎅",
        Duration = 6.5,  -- Set the duration for how long the notification lasts
        Image = "candy-cane",  -- Optional: Use a custom image for Christmas (replace with an actual ID)
    })
end

local currentTime = os.time()  -- Get the current time in seconds since epoch
local currentDate = os.date("*t", currentTime)  -- Convert to table for easier manipulation

-- Check if today is January 1st
if currentDate.month == 1 and currentDate.day == 1 then
    -- Show New Year notification using Rayfield UI
    Rayfield:Notify({
        Title = "Happy New Year! 🎉",
        Content = "Wishing you a year full of joy and success! 🎆",
        Duration = 6.5,  -- Set the duration for how long the notification lasts
        Image = "party-popper",  -- Optional: Use a custom image for New Year's (replace with an actual ID)
    })
end


local Tab = Window:CreateTab("Client Side/Config", 4483362458) -- Title, Image
 local Section = Tab:CreateSection("Server Stuff")

  local Paragraph = Tab:CreateParagraph({Title = "Methods", Content = "Keep the switch disabled if your server allow you teleporting without issues, else enable to use car method(requires to sit on YOUR car seat). And if you want to teleport to other place, teleport back to your seat(in teleports tab). Also you may want to use Snowstorm to jump and ragdoll in open spaces, then teleport with player method, you may want to spam click."})
 local Toggle = Tab:CreateToggle({
    Name = "Teleport Method(Car seat/Player)",
    CurrentValue = true,
    Flag = "Toggle1", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
    Callback = function(Value)
        USE_LEGACY_PLAYER_TELEPORT = Value
    end,
 })

  -- Pega os valores atuais do clima uma única vez
  local weatherState = workspace.ServerData.WeatherState
  local currentClouds = weatherState.Value
  local currentFog = weatherState.Foggy.Value
  local currentRain = weatherState.Raining.Value

  -- Cria os sliders com os valores iniciais
  Tab:CreateSlider({
      Name = "Clouds",
      Range = {0, 1},
      Increment = 0.1,
      Suffix = "Clouds",
      CurrentValue = currentClouds,
      Flag = "Clouds",
      Callback = function(Value)
          weatherState.Value = Value
      end,
  })

  Tab:CreateSlider({
      Name = "Fog",
      Range = {0, 1},
      Increment = 0.1,
      Suffix = "Fog",
      CurrentValue = currentFog,
      Flag = "Fog",
      Callback = function(Value)
          weatherState.Foggy.Value = Value 
      end,
  })

  Tab:CreateSlider({
      Name = "Rain",
      Range = {0, 1},
      Increment = 0.1,
      Suffix = "Rain",
      CurrentValue = currentRain,
      Flag = "Rain",
      Callback = function(Value)
          weatherState.Raining.Value = Value 
      end,
  })
 local Toggle = Tab:CreateToggle({
    Name = "Edited Weather",
    CurrentValue = false,
    Flag = "EditedWeather",
    Callback = function(Value)
        workspace.ServerData.WeatherState:SetAttribute("Edited", Value)
    end,
 })

 local Toggle = Tab:CreateToggle({
    Name = "Snowed Out",
    CurrentValue = false,
    Flag = "SnowedOut",
    Callback = function(Value)
        workspace.ServerData.WeatherState:SetAttribute("SnowedOut", Value)
    end,
 })

 local Toggle = Tab:CreateToggle({
    Name = "Snowstorm",
    CurrentValue = false,
    Flag = "Snowstorm",
    Callback = function(Value)
        workspace.ServerData.WeatherState:SetAttribute("Snowstorm", Value)
    end,
 })

 local Toggle = Tab:CreateToggle({
    Name = "Frozen Time",
    CurrentValue = false,
    Flag = "FrozenTime",
    Callback = function(Value)
        workspace.ServerData.FrozenTime.Value = Value
    end,
 })

 local Button = Tab:CreateButton({
    Name = "ClockPass",
    Callback = function()
        game:GetService("Players").LocalPlayer.Values._ClockPass.Value = 1
        end,
 })
 local Slider = Tab:CreateSlider({
    Name = "Drown Damage",
    Range = {0, 100},
    Increment = 1,
    Suffix = "DD",
    CurrentValue = 10,
    Flag = "DD", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
    Callback = function(Value)
        workspace.ServerData.Configuration.DrownDamage.Value = Value
        end,
 })

 local Button = Tab:CreateButton({
    Name = "Kill(Keep Items)",
    Callback = function()
        game:GetService("ReplicatedStorage"):WaitForChild("Events"):WaitForChild("RequestCharacterReset"):FireServer()
    end,
 })


local Players = game:GetService("Players")
local player = Players.LocalPlayer


        for i, v in pairs(workspace.Plots:GetChildren()) do
            local ownerObject = v:FindFirstChild("Owner")
            
            if ownerObject and ownerObject:IsA("ObjectValue") then
                -- Convertendo valores para string e removendo espaços
                local ownerValue = tostring(ownerObject.Value):gsub("^%s*(.-)%s*$", "%1")  -- Remove espaços antes e depois
                local playerName = tostring(game.Players.LocalPlayer.Name):gsub("^%s*(.-)%s*$", "%1")  -- Remove espaços antes e depois
                
                -- Comparação direta
                if ownerValue == playerName then
                    print("You own:", v.Name)
                    _G.ownedPlot = v
                end
            end
        end

-- Function to find a seat owned by the player
local function findDriverSeat(vehicle)
    for _, part in ipairs(vehicle:GetDescendants()) do
        if part:IsA("VehicleSeat") or part:IsA("Seat") then
            if part:FindFirstChild("Owner") then
                if part.Owner.Value == player or tostring(part.Owner.Value) == tostring(player.UserId) then
                    return part
                end
            elseif vehicle:FindFirstChild("Owner") then
                return part
            end
        end
    end
    return nil
end

-- Function to get the player's vehicle seat
local function getMyVehicleSeat()
    if not workspace:FindFirstChild("Vehicles") then return nil end

    for _, vehicle in ipairs(workspace.Vehicles:GetChildren()) do
        if vehicle:IsA("Model") and vehicle:FindFirstChild("Owner") then
            local ownerValue = vehicle.Owner
            if ownerValue and (ownerValue.Value == player or tostring(ownerValue.Value) == tostring(player.UserId)) then
                local seat = findDriverSeat(vehicle)
                if seat then return seat end
            end
        end
    end
    return nil
end

local function getSeatWeld()
    local mySeat = getMyVehicleSeat()
    if mySeat then
        local weld = mySeat:FindFirstChild("SeatWeld")
        if weld then
            return weld
        end
    end
    return nil
end

local function updateWeldPart0(newPart)
    local weld = getSeatWeld()
    if weld and newPart then
        weld.Part0 = newPart
        weld.C0 = CFrame.new(0, 0, 0)
        print("Weld atualizado para o novo Part0.")
    elseif not weld then
        warn("Weld (SeatWeld) não encontrado!")
    elseif not newPart then
        warn("Novo Part0 não encontrado!")
    end
end

local function teleportToLocation(target)
    if not target then return end

    local player = game.Players.LocalPlayer
    local hrp = player.Character and player.Character:FindFirstChild("HumanoidRootPart")

    if USE_LEGACY_PLAYER_TELEPORT and hrp then
        -- Se "target" já for um CFrame, usar diretamente
        if typeof(target) == "CFrame" then
            hrp.CFrame = target
        elseif typeof(target) == "Instance" and target:IsA("BasePart") then
            hrp.CFrame = target.CFrame
        end
    else
        updateWeldPart0(target)
    end
end

-- Function to get the current identity level
local function getIdentityLevel()
    return syn and syn.get_thread_identity and syn.get_thread_identity() or getidentity and getidentity() or 3
end

-- Check if the identity level is 4 or higher
local identityLevel = getIdentityLevel()
local exploitSupported = identityLevel >= 4

if not exploitSupported then
    Rayfield:Notify({
        Title = "Warning",
        Content = "Your exploit's execution level is insufficient. Some features may not work correctly.",
        Duration = 8.5,
        Image = "alert-circle",
    })
end
 -- Create the main tabs
local Tab = Window:CreateTab("Perfect Hit", 4483362458) -- Tab for Perfect Hit settings

-- Add a paragraph explaining the differences
local Paragraph = Tab:CreateParagraph({
    Title = "Perfect Hit", 
    Content = "If you see 2 Perfect Hits, it means your exploit supports both methods. However, if you only see one, it means your exploit doesn't support the required functions."
})

-- If exploit functions are available, create the toggle
local enabled = false  -- Default state is disabled

if exploitSupported then
    local Toggle = Tab:CreateToggle({
        Name = "Perfect Hit",
        CurrentValue = false,
        Flag = "PH", -- Flag to save state
        Callback = function(Value)
            enabled = Value -- Update the enabled state based on the toggle value
            print("Attack Modification:", enabled and "ON" or "OFF")
        end,
    })

    -- Hook the RemoteEvent
    local mt = getrawmetatable(game)
    local oldNamecall = mt.__namecall

    local success, _ = pcall(function()
        setreadonly(mt, false)
    end)

    if not success then
        Rayfield:Notify({
            Title = "Warning",
            Content = "Your exploit doesn't support setreadonly. Perfect Hit may not work as expected.",
            Duration = 8.5,
            Image = "message-circle-warning",
        })
    end

    mt.__namecall = function(self, ...)
        local method = getnamecallmethod()
        local args = {...}

        if enabled and method == "FireServer" and tostring(self) == "Attack" then
            if type(args[1]) == "table" then
                args[1].Alpha = 1 -- Full damage
                args[1].ResponseTime = 0 -- Instant hit
                --print("Intercepted Attack: Alpha set to 1, ResponseTime set to 0")
            end
            return oldNamecall(self, table.unpack(args))
        end

        return oldNamecall(self, ...)
    end

    -- Attempt to set the metatable back to read-only
    pcall(function()
        setreadonly(mt, true)
    end)
end

-- Create the keybind version (for exploits without required functions)
local Keybind = Tab:CreateKeybind({
    Name = "Perfect Hit (Keybind)",
    CurrentKeybind = "P",
    HoldToInteract = false,
    Flag = "PoorPH", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
    Callback = function(Keybind)
        if exploitSupported then
            Rayfield:Notify({
                Title = "Warning",
                Content = "Your exploit supports advanced methods. Use the toggle instead.",
                Duration = 8.5,
                Image = "message-circle-warning",
            })
            return
        end
        local ohTable1 = {
            ["Alpha"] = 1,
            ["ResponseTime"] = 0.76456
        }
        game:GetService("ReplicatedStorage").Events.Tools.Attack:FireServer(ohTable1)
    end,
})

-- Add a paragraph explaining the differences
local Paragraph = Tab:CreateParagraph({
    Title = "The differences", 
    Content = "The toggle version can be turned on or off, and you can leave it enabled if you'd like. The keybind version is for exploits that lack the required functions, so you need to press a key to make it work. In this case, click on a tree, rock, or water, and while the power bar is on screen, pressing the key will complete the action with a perfect hit."})

local TabF = Window:CreateTab("Auto Fish", 4483362458) -- Create a new tab for grab settings
local rotationConnection = nil -- Store the rotation connection
local Paragraph = TabF:CreateParagraph({
    Title = "Warning", 
    Content = "This is only for the fishing minigame."
})

local Toggle = TabF:CreateToggle({
    Name = "Auto-Fish",
    CurrentValue = false,
    Flag = "AutoFishToggle",
    Callback = function(Value)
        local fish = game:GetService("Players").LocalPlayer.PlayerGui.UserGui.CatchFrame.Fish
        
        local function fireSide(side)
            game:GetService("ReplicatedStorage"):WaitForChild("Events"):WaitForChild("Tools")
                :WaitForChild("ChangeFishPull"):FireServer({ Side = side })
        end

        -- Disconnect any existing connection when toggling
        if rotationConnection then
            rotationConnection:Disconnect()
            rotationConnection = nil
        end

        if Value then
            local function handleRotation()
                local rotation = math.floor(fish.Rotation % 360)
                if rotation < 0 then rotation = 360 + rotation end

                if rotation == 0 then
                    fireSide("Left")
                elseif rotation == 180 then
                    fireSide("Right")
                elseif rotation == 90 then
                    fireSide("Top")
                elseif rotation == 270 then
                    fireSide("Bottom")
                end
            end

            -- Store the new connection
            rotationConnection = fish:GetPropertyChangedSignal("Rotation"):Connect(handleRotation)
        end
    end,
})


--[[
  AutoFish + AutoGrab Simplificado
  Requer Rayfield (ou outra lib de UI)
--]]
--[[ TODO
-- Serviços
local Players          = game:GetService("Players")
local ReplicatedStorage= game:GetService("ReplicatedStorage")
local RunService       = game:GetService("RunService")
local localPlayer      = Players.LocalPlayer
local player  = Players.LocalPlayer
local gui     = player:WaitForChild("PlayerGui")
local userGui = gui:WaitForChild("UserGui")
local catchFrame = userGui:WaitForChild("CatchFrame")
local MAX_DISTANCE    = 20

-- flag e conexão para o loop de teleporte
local autoTeleportEnabled = false
local teleportConn

-- Função que checa se está dentro do alcance
local function isNearPlayer(part)
    if not localPlayer.Character then return false end
    local root = localPlayer.Character:FindFirstChild("HumanoidRootPart")
    return root and (root.Position - part.Position).Magnitude <= MAX_DISTANCE
end

-- Função de teleporte de um modelo para o plot do jogador
local function teleportToPlot(item)
    if not (_G.ownedPlot and _G.ownedPlot.Plot) then return end
    local plotCFrame = _G.ownedPlot.Plot.CFrame
    item:SetPrimaryPartCFrame(plotCFrame)
end
-- Toggle na UI
local Toggle = TabF:CreateToggle({
    Name         = "Auto-Teleport to Plot (within range)",
    CurrentValue = false,
    Flag         = "AutoTeleportToPlotInRange",
    Callback     = function(state)
        autoTeleportEnabled = state
 
        if state then
            teleportConn = RunService.Heartbeat:Connect(function()
                if not autoTeleportEnabled or not localPlayer.Character then return end
 
                for _, item in ipairs(workspace.Grab:GetChildren()) do
                    if item:IsA("Model") and item.PrimaryPart then
                        -- só teleportar se estiver dentro do alcance
                        if isNearPlayer(item.PrimaryPart) then
                            teleportToPlot(item)
                        end
                    end
                end
            end)
 
        else
            if teleportConn then
                teleportConn:Disconnect()
                teleportConn = nil
            end
        end
    end,
 })
-- Configurações AutoGrab
local COOLDOWN_GRAB   = 0.5
local TARGET_FOLDER   = workspace:WaitForChild("Grab")
local autoGrabEnabled = false

-- Funções AutoGrab
local function isNearPlayer(part)
    if not localPlayer.Character then return false end
    local root = localPlayer.Character:FindFirstChild("HumanoidRootPart")
    return root and (root.Position - part.Position).Magnitude <= MAX_DISTANCE
end

local function findMeshOrPart(parent)
    for _, c in ipairs(parent:GetDescendants()) do
        if c:IsA("BasePart") then return c end
    end
end

local function iniciarAutoGrab()
    coroutine.wrap(function()
        while autoGrabEnabled do
            for _, item in ipairs(TARGET_FOLDER:GetChildren()) do
                if not autoGrabEnabled then break end
                if item:IsA("Model") then
                    local owner = item:FindFirstChild("Owner")
                    if owner and (
                       (owner:IsA("StringValue") and owner.Value == localPlayer.Name) or
                       (owner:IsA("ObjectValue") and owner.Value == localPlayer)
                    ) then
                        local part = findMeshOrPart(item)
                        if part and isNearPlayer(part) then
                            pcall(function()
                                ReplicatedStorage.Events.GrabHandler:InvokeServer(part, "Grab", part.Position)
                                print("Grabbed:", item.Name)
                            end)
                            task.wait(COOLDOWN_GRAB)
                        end
                    end
                end
            end
            task.wait(1)
        end
    end)()
end


-- ===================================================================
-- AutoFish por Zona (versão simplificada)
-- ===================================================================

-- Ferramentas de pesca
local function getTools()
    return ReplicatedStorage:WaitForChild("Events"):WaitForChild("Tools")
end

local folderName = "FLF"
local existingFolder = workspace:FindFirstChild(folderName)

-- Delete the old folder
if existingFolder then
    existingFolder:Destroy()
end

local FFolder = Instance.new("Folder", workspace)-- Parte de referência
FFolder.Name = "FLF"
--local basePart = workspace.MouseIgnore.FishZones.VeilLake:GetChildren()[3] -- substitua "BasePart" pelo nome da sua parte

    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(-665.43896484375, 94.5, 1951.5361328125) -- 5 studs acima
    newPart.Name = "VeilLake"
    newPart.Parent = FFolder

-- Parte de referência
--local basePart1 = workspace.MouseIgnore.Water.WaterZones.Swamp -- substitua "BasePart" pelo nome da sua parte

    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(1288.9095458984375, -3.566533088684082, 2044.602294921875) 
    newPart.Name = "Swamp"
    newPart.Parent = FFolder

-- Parte de referência
--local basePart2 = workspace.Map.Rosewell.MagmaExitNoDespawn -- substitua "BasePart" pelo nome da sua parte

    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(-7504.20947265625, -4.584564208984375, -2419.97607421875)
    newPart.Name = "Sarcophagus"
    newPart.Parent = FFolder
--local basePart3 = workspace.MouseIgnore.Water.WaterZones.CrystalPond -- substitua "BasePart" pelo nome da sua parte

    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(-7481.18505859375, -627, 1105.9532470703125) -- 5 studs acima
    newPart.Name = "Crystal"
    newPart.Parent = FFolder

    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(-16.649139404296875, -553.4144897460938, 1622.4593505859375) -- 5 studs acima
    newPart.Name = "LushCave"
    newPart.Parent = FFolder
    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(350.1985778808594, 206.875, 3612.182861328125) -- 5 studs acima
    newPart.Name = "Jungle"
    newPart.Parent = FFolder

    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(3239.537109375, 0, -2120.1630859375) -- 5 studs acima
    newPart.Name = "SmallCoral"
    newPart.Parent = FFolder

    -- Criar a nova parte
    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(-2795.35009765625, 0, 584.9410400390625) -- 5 studs acima
    newPart.Name = "BigCoral"
    newPart.Parent = FFolder

    local newPart = Instance.new("Part")
    newPart.Size = Vector3.new(4, 1, 4) -- tamanho opcional
    newPart.Anchored = true
    newPart.CanCollide = false
    newPart.Transparency = 1
    newPart.CanTouch = false
    newPart.CanQuery = false
    newPart.Position = Vector3.new(-7207.99365234375, -610.065673828125, -2828.533935546875) -- 5 studs acima
    newPart.Name = "Magma"
    newPart.Parent = FFolder

-- Tabela de zonas
local locais = {
    CrystalPond = {
        Lugar    = FFolder.Crystal,
        hitPosition = Vector3.new(-7488.06005859375, -644.4749755859375, 1084.1500244140625), --fix
        toggle      = false
    },
    BigCoral = {
        Lugar    = FFolder.BigCoral,
        hitPosition = Vector3.new(-2795.201416015625, -5.974999904632568, 581.2570190429688), --fix
        toggle      = false
    },
    SmallCoral = {
        Lugar    = FFolder.SmallCoral,
        hitPosition = Vector3.new(3239.78369140625, -5.974999904632568, -2123.648193359375),
        toggle      = false
    },
    Jungle = {
        Lugar    = FFolder.Jungle, 
        hitPosition = Vector3.new(352.3348083496094, 208.94345092773438, 3609.23583984375), 
        toggle      = false
    },
    LushCave = {
        Lugar    = FFolder.LushCave,
        hitPosition = Vector3.new(-14.756388664245605, -551.389404296875, 1618.079345703125), --fix
        toggle      = false
    },
    Sarcophagus = {
        Lugar    = FFolder.Sarcophagus,
        hitPosition = Vector3.new(-7511.8154296875, -5.974999904632568, -2423.219970703125),
        toggle      = false
    },
    Swamp = {
        Lugar    = FFolder.Swamp,
        hitPosition = Vector3.new(1300.220947265625, -6.04153299331665, 2046.1671142578125), --fix
        toggle      = false
    },
    Veillake = {
        Lugar    = FFolder.VeilLake,
        hitPosition = Vector3.new(-662.387451171875, 89.349609375, 1950.559814453125), --fix
        toggle      = false
    }
}

-- Função de pesca simplificada
local function iniciarPesca(localNome)
    local dados = locais[localNome]
    coroutine.wrap(function()
        local tools = getTools()
        while dados.toggle do
            -- 1) Teleporta
            local hrp = localPlayer.Character and localPlayer.Character:FindFirstChild("HumanoidRootPart")
            if hrp then
                teleportToLocation(dados.Lugar)
        end
            task.wait(1)

            -- 3) Charge (lançar isca)
            pcall(function()
                tools.Charge:FireServer({HitPosition = dados.hitPosition})
            end)

            -- 4) Aguarda “morder” — use um timeout fixo
            task.wait(1.5)

            -- 5) Attack (puxar peixe)
            pcall(function()
                tools.Attack:FireServer({Alpha = 1, ResponseTime = 2})
            end)

            -- 6) Aguarda cooldown antes da próxima pescaria
            repeat task.wait(0.1) until catchFrame.Visible
            repeat task.wait(2) until not catchFrame.Visible
        end
    end)()
end

TabF:CreateParagraph({
    Title   = "AutoFish each zone",
    Content = "Equip your Fishing Rod and toggle zones below. Simplified timing replaces GUI-checks."
})

-- Cria toggles por zona
for nome, dados in pairs(locais) do
    TabF:CreateToggle({
        Name         = "Auto "..nome,
        CurrentValue= false,
        Flag         = "Toggle"..nome,
        Callback     = function(state)
            dados.toggle    = state
            autoGrabEnabled = state

            if state then
                iniciarPesca(nome)
                iniciarAutoGrab()
            end
        end
    })
end
--]]

local Tab1 = Window:CreateTab("Resources", 4483362458)

local UserInputService = game:GetService("UserInputService")
local players = game:GetService("Players")
local player = players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local grabFolder = workspace:WaitForChild("Grab") -- Folder containing the parts to grab
local selectedOption = "Sell" -- Initial selected option
local autoSellEnabled = false -- Auto-sell toggle state

-- UI Elements
local Paragraph = Tab1:CreateParagraph({
    Title = "Teleport and How to use", 
    Content = "Choose here an option to where teleport, enable the switch and remember it will only teleport if you press the Teleport Keybind(can change to other key) key while holding an object"
})
-- Função para encontrar o modelo (Model) que contém o _Grab
local function findModelOfGrab()
    --print("Procurando _Grab dentro de workspace.Grab...")
    for _, part in ipairs(grabFolder:GetDescendants()) do
        if part.Name == "_Grab" then
            --print("_Grab encontrado: ", part:GetFullName())
            local current = part
            while current.Parent do
                current = current.Parent
                if current:IsA("Model") then
                    --print("Model encontrado: ", current:GetFullName())
                    return current
                end
            end
            --print("Nenhum Model encontrado acima de _Grab.")
        end
    end
    --print("_Grab não encontrado em nenhum descendente.")
    return nil
end

-- Function to teleport the parent or part based on selected option
local function teleportParentOrPart()
    if not _G.TeleportItemEnabled then
        return
    end

    local player = game.Players.LocalPlayer
    local humroot = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
    local teleportPlayer = _G.TeleportPlayerEnabled
    local targetModel = findModelOfGrab()  -- Always get the current model
    
    if not targetModel then
        return  -- No model to teleport
    end

    local targetCFrame = nil

    if selectedOption == "Your Plot" then
        targetCFrame = _G.ownedPlot.Plot.CFrame * CFrame.new(0, 5, 0)
    elseif selectedOption == "Sell" then
        targetCFrame = CFrame.new(927.2778930664062, 29.87200355529785, -703.7294921875)
    elseif selectedOption == "Enchant" then
        local enchantAltar = workspace.Map.Caves.NovaCaveSystem.Layer3.Model:FindFirstChild("EnchantAltar")
        if enchantAltar and enchantAltar:IsA("Model") then
            -- Use the model's primary part if it exists, otherwise find the first BasePart
            local part = enchantAltar.PrimaryPart or enchantAltar:FindFirstChildWhichIsA("BasePart")
            if part then
                targetCFrame = part.CFrame * CFrame.new(0, 3, 0) -- Slightly above the altar
            end
        end
    elseif selectedOption == "Sawmill" then
        for _, obj in pairs(_G.ownedPlot.Objects:GetChildren()) do
            if obj.Name:match("Sawmill") and obj:FindFirstChild("Hitbox") then
                for _, child in pairs(obj.Sawmill:GetChildren()) do
                    if child.Name == "Model" and child:IsA("Model") then
                        child:Destroy()
                    end
                end
                targetCFrame = obj.Hitbox.CFrame
                break
            end
        end
    elseif selectedOption == "Furnace" then
        for _, obj in pairs(_G.ownedPlot.Objects:GetChildren()) do
            if obj.Name:match("Furnace") and obj:FindFirstChild("Hitbox") then
                targetCFrame = obj.Hitbox.CFrame
                break
            end
        end
    elseif selectedOption == "Vi's Lab" then
        local violet = workspace.Npcs:FindFirstChild("Violet")
        if violet and violet:IsA("Model") then
            targetCFrame = violet:GetPivot()
        end
    elseif selectedOption == "Nautic Finds Sellary" then
        targetCFrame = workspace.Map.Structures.Nautic_Sellary.SellZone.Area.CFrame
    elseif selectedOption == "Sifter" then
        targetCFrame = _G.ownedPlot.Objects.Sifter.Hitbox.CFrame * CFrame.new(0, 5, 0)
    elseif selectedOption == "Polisher" then
        targetCFrame = _G.ownedPlot.Objects.Polisher.InsideHitbox.CFrame
    end

    if targetCFrame then
        -- Ensure model has a PrimaryPart
        if not targetModel.PrimaryPart then
            local firstPart = targetModel:FindFirstChildWhichIsA("BasePart")
            if firstPart then
                targetModel.PrimaryPart = firstPart
            else
                warn("No BasePart in model, teleport canceled.")
                return
            end
        end

        -- Store player's original position if teleporting player
        local originCFrame = teleportPlayer and humroot and humroot.CFrame

        -- Teleport the model
        targetModel:SetPrimaryPartCFrame(targetCFrame)

        -- Handle auto-sell if needed
        if selectedOption == "Sell" and autoSellEnabled then
            Sell()
        end

        -- Teleport player if needed
        if teleportPlayer and originCFrame then
            if humroot then
                humroot.CFrame = targetCFrame
                task.delay(0.5, function()
                    if player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
                        player.Character.HumanoidRootPart.CFrame = originCFrame
                    end
                end)
            end
        end
    end
end

local keybindTeleport = Tab1:CreateKeybind({
   Name = "Teleport Keybind",
   CurrentKeybind = "LeftAlt", -- Pode ser "Q", "E", "F", etc.
   HoldToInteract = false,
   Flag = "TeleportKeybind",
   Callback = function()
       if _G.TeleportItemEnabled then
           teleportParentOrPart()
       end
   end,
})

local Dropdown = Tab1:CreateDropdown({
    Name = "Teleport Where?",
    Options = {"Sell", "Your Plot", "Sawmill", "Furnace", "Enchant", "Vi's Lab", "Nautic Finds Sellary", "Sifter", "Polisher"},
    CurrentOption = "Sell",
    MultipleOptions = false,
    Flag = "DragDrop",
    Callback = function(Option)

        if type(Option) == "table" then
            selectedOption = Option[1]
        else
            selectedOption = Option
        end
    end,
})

_G.TeleportPlayerEnabled = false -- or false, depending on toggle state
_G.TeleportItemEnabled = false

local Toggle = Tab1:CreateToggle({
    Name = "Toggle Teleport",
    CurrentValue = false,
    Flag = "TeleportItem", -- Identifier for saving configuration
    Callback = function(Value)
        _G.TeleportItemEnabled = Value -- Update the toggle state based on the button value
    end,
})

local teleportToggle = Tab1:CreateToggle({
    Name = "Teleport Player",
    CurrentValue = false,
    Flag = "TeleportPlayer", -- optional
    Callback = function(Value)
        _G.TeleportPlayerEnabled = Value
    end,
})


--[[ Add Auto Sell Toggle
local AutoSellToggle = Tab1:CreateToggle({
    Name = "Auto Sell When Teleporting to Sell",
    CurrentValue = false,
    Flag = "AutoSellToggle",
    Callback = function(Value)
        autoSellEnabled = Value
    end,
})

-- Function to sell items
function Sell()
    local args = {
	"Deal",
	1
}
workspace:WaitForChild("Map"):WaitForChild("Structures"):WaitForChild("Nova_Sellary"):WaitForChild("TalkPart"):WaitForChild("Interact"):FireServer(unpack(args))

end
--]]




local Button = Tab1:CreateButton({
    Name = "Teleport player to enchant",
    Callback = function()
        local enchantAltar = workspace.Map.Caves.NovaCaveSystem.Layer3.Model:FindFirstChild("EnchantAltar")
        if enchantAltar and enchantAltar:IsA("Model") then
            local part = enchantAltar.PrimaryPart or enchantAltar:FindFirstChildWhichIsA("BasePart")
            if part then
                teleportToLocation(part.CFrame * CFrame.new(0, 3, 0))
            else
                Rayfield:Notify({
                    Title = "Error",
                    Content = "Could not find a valid part in the EnchantAltar model.",
                    Duration = 5,
                    Image = "alert-circle"
                })
            end
        else
            Rayfield:Notify({
                Title = "Error",
                Content = "EnchantAltar not found in the expected location.",
                Duration = 5,
                Image = "alert-circle"
            })
        end
    end,
 })

local Paragraph = Tab1:CreateParagraph({
    Title = "Teleport to a Tree/Ore", 
    Content = "Select any of the options below and be teleported. You may want to use the script above to teleport items to your Plot."
})

local function fetchOptionsFromFolder(folder)
    local options = {}

    -- Fetch names of models inside the folder
    for _, item in ipairs(folder:GetChildren()) do
            table.insert(options, item.Name)
    end

    return options
end

local function updateTreeOptions(currentSelection)
    local treesFolder = game:GetService("ReplicatedStorage").Content.Trees
    local treeOptions = {}
    local uniqueTreeNames = {}

    -- Helper function to remove numbers at the end of tree names
    local function getBaseTreeName(name)
        -- Remove numbers from the end of the tree name (e.g., "Festive Tree 1" -> "Festive Tree")
        return name:gsub("%s%d+$", "")
    end

    -- Populate treeOptions
    for _, tree in ipairs(treesFolder:GetChildren()) do
            local baseTreeName = getBaseTreeName(tree.Name)
            if not uniqueTreeNames[baseTreeName] then
                table.insert(treeOptions, baseTreeName)
                uniqueTreeNames[baseTreeName] = true
        end
    end

    -- Check if the currentSelection is valid, if not, reset it to the first option
    if currentSelection and not table.find(treeOptions, currentSelection) then
        return treeOptions, treeOptions[1]
    end

    return treeOptions, currentSelection or treeOptions[1]
end

local function updateOreOptions(currentSelection)
    local oresFolder = game:GetService("ReplicatedStorage").Content.Ores
    local oreOptions = fetchOptionsFromFolder(oresFolder)

    -- Check if the currentSelection is valid, if not, reset it to the first option
    if currentSelection and not table.find(oreOptions, currentSelection) then
        return oreOptions, oreOptions[1]
    end

    return oreOptions, currentSelection or oreOptions[1]
end

-- Create Dropdown for Trees
local TreeDropdown = Tab1:CreateDropdown({
    Name = "Select Tree",
    Options = updateTreeOptions(), 
    CurrentOption = {updateTreeOptions()[1]},
    MultipleOptions = false,
    Flag = "DDT",
    Callback = function(Option)
        local selectedTreeName = Option[1]
    end,
})

-- Create Dropdown for Ores
local OreDropdown = Tab1:CreateDropdown({
    Name = "Select Ore",
    Options = updateOreOptions(), 
    CurrentOption = {updateOreOptions()[1]},
    MultipleOptions = false,
    Flag = "ORE_DDT",
    Callback = function(Option)
        local selectedOreName = Option[1]
    end,
})

-- Button to teleport to the selected tree
local TeleportTreeButton = Tab1:CreateButton({
    Name = "Teleport to Selected Tree",
    Callback = function()
        local selectedTreeName = TreeDropdown.CurrentOption[1] -- Gets the currently selected tree from the dropdown
 
        -- Search for the selected tree in both locations
        local selectedTree
        local treeLocations = {
            game:GetService("ReplicatedFirst").HiddenTrees,
            workspace.WorldSpawn.Trees
        }
 
        for _, location in ipairs(treeLocations) do
            selectedTree = location:FindFirstChild(selectedTreeName)
            if selectedTree then
                break -- Stop searching once the tree is found
            end
        end
 
        if selectedTree then
            local branchPart = selectedTree:FindFirstChild("Hittable") and selectedTree.Hittable:FindFirstChild("Branch")
            local part = selectedTree:FindFirstChild("Hittable") and selectedTree.Hittable:FindFirstChild("Part")
            local targetPart = branchPart or part
 
            if targetPart then
                local player = game.Players.LocalPlayer
                teleportToLocation(targetPart)
            else
                --warn("No 'Branch' or 'Part' found in the tree: " .. selectedTreeName)
            end
        else
            Rayfield:Notify({
                Title = "Something went wrong",
                Content = "Seems like this tree still don't exist in the server, you may want to teleport to the tree zone to it spawn",
                Duration = 6.5,
                Image = "triangle-alert",
             })
        end
    end,
 })
 
-- Button to teleport to the selected ore
local TeleportOreButton = Tab1:CreateButton({
    Name = "Teleport to Selected Ore",
    Callback = function()
        local selectedOreName = OreDropdown.CurrentOption[1] -- Gets the currently selected ore from the dropdown
 
        -- Search for the selected ore in both locations
        local selectedOre
        local oreLocations = {
            game:GetService("ReplicatedFirst").HiddenOres,
            workspace.WorldSpawn.Ores
        }
 
        for _, location in ipairs(oreLocations) do
            selectedOre = location:FindFirstChild(selectedOreName)
            if selectedOre then
                break -- Stop searching once the ore is found
            end
        end
 
        if selectedOre then
            local hitboxPart = selectedOre:FindFirstChild("Hitbox")
            if hitboxPart then
                local player = game.Players.LocalPlayer
                    teleportToLocation(hitboxPart)            
                else
                --warn("No 'Hitbox' found in the ore: " .. selectedOreName)
            end
        else
            Rayfield:Notify({
                Title = "Something went wrong",
                Content = "Seems like this ore still don't exist in the server, you may want to teleport to the ore zone for it spawn",
                Duration = 6.5,
                Image = "triangle-alert",
             })
            end
    end,
 })


 local Tab2 = Window:CreateTab("Teleports", 4483362458) -- Title, Image
local Button = Tab2:CreateButton({
    Name = "Teleport to Vehicle Seat",
    Callback = function()
            local seat = getMyVehicleSeat()
    if seat then
        seat.CanTouch = true
    end

        local player = game.Players.LocalPlayer
        if seat and player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
            player.Character.HumanoidRootPart.CFrame = seat.CFrame + Vector3.new(0, 3, 0) -- teleport slightly above the seat
        else
            warn("Seat not found or player character invalid.")
        end
    end,
})

 local Button = Tab2:CreateButton({
    Name = "Tween to Plot",
    Callback = function()
        
        local TweenService = game:GetService("TweenService")
        local player = game.Players.LocalPlayer
        local character = workspace.Live:FindFirstChild(player.Name) -- Obtém o personagem do jogador local em workspace.Live
        local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
        
        -- Define a posição alvo para o tween, que será a posição da plot do jogador
        local targetPosition = _G.ownedPlot.Plot.Position + Vector3.new(0, 3, 0) -- Ajuste conforme necessário
        
        -- Cria informações do Tween
        local tweenInfo = TweenInfo.new(
            2, -- Duração do tween em segundos
            Enum.EasingStyle.Quad, -- Estilo de easing
            Enum.EasingDirection.Out -- Direção do easing
        )
        
        -- Cria o tween para mover o personagem
        local tween = TweenService:Create(humanoidRootPart, tweenInfo, {CFrame = CFrame.new(targetPosition)})
        
        -- Inicia o tween
        tween:Play()
        
        -- Limpeza após o tween completar
        tween.Completed:Connect(function()
            --print("Tween completed, you reached the destination!")
        end)
end
         })

local player = game.Players.LocalPlayer

-- Function to get the current list of NPC names
local function updateNPCOptions()
    local npcList = {} -- Table to store NPC names
    local npcsFolder = workspace:FindFirstChild("Npcs") -- Get the Npcs folder
    if npcsFolder then
        for _, npc in ipairs(npcsFolder:GetChildren()) do
            if npc:IsA("Model") then
                table.insert(npcList, npc.Name) -- Add NPC name to the list
            end
        end
    end
    return npcList
end

-- Create the dropdown for teleporting to NPCs
local NPCDropdown = Tab2:CreateDropdown({
   Name = "Teleport to NPCs",
   Options = updateNPCOptions(), -- Using the list of options generated
   CurrentOption = {updateNPCOptions()[1]}, -- Set the first option as default
   MultipleOptions = false,
   Flag = "NPC_DDT", -- Unique flag for this dropdown
   Callback = function(Option)
       local selectedNPCName = Option[1] -- Get the selected NPC name
       local selectedNPC = workspace.Npcs:FindFirstChild(selectedNPCName) -- Find the corresponding NPC

       if selectedNPC and selectedNPC:IsA("Model") then
           local targetCFrame

           if selectedNPC.PrimaryPart then
               -- Use the PrimaryPart if it's set
               targetCFrame = selectedNPC.PrimaryPart
           else
               -- Fallback: use the model's center position
               targetCFrame = selectedNPC:GetPivot()
           end

           -- Now teleport to that CFrame
           teleportToLocation(targetCFrame) -- You may want to offset the Y a bit (e.g., +Vector3.new(0, 5, 0)) to avoid clipping
       else
           -- warn("The selected NPC could not be found or is not a model.")
       end
   end,
})

-- Optionally, if you want to refresh the dropdown options later
-- NPCDropdown:Set(updateNPCOptions()) -- Call this to refresh the options whenever needed

local player = game.Players.LocalPlayer

-- Function to get the current list of plot names
local function updatePlotOptions()
    local plotList = {} -- Table to store plot names
    local plotsFolder = workspace:FindFirstChild("Plots") -- Get the Plots folder
    if plotsFolder then
        for _, plot in ipairs(plotsFolder:GetChildren()) do
            if plot:IsA("Model") and plot:FindFirstChild("Plot") then
                table.insert(plotList, plot.Name) -- Add plot name to the list
            end
        end
    else
       -- warn("Plots folder not found in workspace.")
    end
    return plotList
end

-- Create the dropdown for teleporting to plots
local PlotDropdown = Tab2:CreateDropdown({
   Name = "Teleport to Plots",
   Options = updatePlotOptions(), -- Using the list of options generated
   CurrentOption = {updatePlotOptions()[1]}, -- Set the first option as default
   MultipleOptions = false,
   Flag = "PLOT_DDT", -- Unique flag for this dropdown
   Callback = function(Option)
       local selectedPlotName = Option[1] -- Get the selected plot name
       local selectedPlot = workspace.Plots:FindFirstChild(selectedPlotName) -- Find the corresponding plot

       if selectedPlot and selectedPlot:FindFirstChild("Plot") then
           -- Teleport the player to the CFrame of the plot
           teleportToLocation(selectedPlot.Plot) -- Teleport the player to the plot's CFrame
       else
         --updateWeldPart0(selectedPlot.Plots)--  warn("The selected plot could not be found or does not have a 'Plot' child.")
       end
   end,
})

-- Optionally, if you want to refresh the dropdown options later
-- PlotDropdown:Set(updatePlotOptions()) -- Call this to refresh the options whenever needed

local player = game.Players.LocalPlayer

-- Function to get the current list of player names (excluding local player)
local function updatePlayerOptions()
    local playerList = {}
    local localPlayerName = game.Players.LocalPlayer.Name
    local liveFolder = workspace:FindFirstChild("Live")
    
    if liveFolder then
        for _, livePlayer in ipairs(liveFolder:GetChildren()) do
            -- Only add if it's a Model, has HumanoidRootPart, and is not the local player
            if livePlayer:IsA("Model") and 
               livePlayer:FindFirstChild("HumanoidRootPart") and 
               livePlayer.Name ~= localPlayerName then
                
                table.insert(playerList, livePlayer.Name)
            end
        end
    end
    
    return playerList
end

-- Create the dropdown for teleporting to players
local PlayerDropdown = Tab2:CreateDropdown({
   Name = "Teleport to Players",
   Options = updatePlayerOptions(), -- Initial options
   CurrentOption = {"Select a player"}, -- Default option
   MultipleOptions = false,
   Flag = "PLAYER_DDT",
   Callback = function(Option)
       -- Callback not needed here as we're using a separate button
   end,
})

-- Function to update the player dropdown
local function updatePlayerDropdown()
    local options = updatePlayerOptions()
    if #options > 0 then
        -- Store current selection if any
        local currentSelection = PlayerDropdown.CurrentOption[1] ~= "No players found" and PlayerDropdown.CurrentOption[1] or nil
        
        -- Update options
        PlayerDropdown:Refresh(options)
        
        -- Try to restore selection if it still exists in the new options
        if currentSelection and table.find(options, currentSelection) then
            PlayerDropdown:Set({currentSelection})
        end
    else
        PlayerDropdown:Refresh({"No players found"})
    end
end

-- Update the dropdown every 5 seconds with better error handling
spawn(function()
    while true do
        local success, err = pcall(updatePlayerDropdown)
        if not success then
            warn("Failed to update player dropdown:", err)
        end
        wait(5)
    end
end)

-- Create a button to teleport to the selected player
local TeleportButton = Tab2:CreateButton({
   Name = "Teleport to Selected Player",
   Callback = function()
       if not PlayerDropdown.CurrentOption or PlayerDropdown.CurrentOption[1] == "No players found" then
           Rayfield:Notify({
               Title = "Error",
               Content = "No player selected or no players found.",
               Duration = 3,
               Image = "alert-circle",
           })
           return
       end
       
       local selectedPlayerName = PlayerDropdown.CurrentOption[1]
       local selectedPlayer = workspace.Live:FindFirstChild(selectedPlayerName)
       
       if selectedPlayer and selectedPlayer:FindFirstChild("HumanoidRootPart") then
           teleportToLocation(selectedPlayer.HumanoidRootPart)
       else
           Rayfield:Notify({
               Title = "Error",
               Content = "Could not find the selected player.",
               Duration = 3,
               Image = "alert-circle",
           })
       end
   end,
})

-- Initial update
updatePlayerDropdown()


-- Function to get all location names in workspace.MouseIgnore.Locations
local function updateLocationOptions()
   local locationList = {} -- Table to store location names
   local locationsFolder = workspace.MouseIgnore:FindFirstChild("Locations") -- Get the Locations folder
   
   if locationsFolder then
       for _, location in ipairs(locationsFolder:GetChildren()) do
           if location:IsA("Model") or location:IsA("Part") then -- Check if the child is a Model or Part
               table.insert(locationList, location.Name) -- Add the location name to the list
           end
       end
   else
       -- warn("Locations folder not found in workspace.MouseIgnore.")
   end

   return locationList -- Return the list of location names
end

-- Create the dropdown for locations
local LocationDropdown = Tab2:CreateDropdown({
   Name = "Select Location",
   Options = updateLocationOptions(), -- Using the list of options generated
   CurrentOption = {updateLocationOptions()[1]}, -- Set the first option as default (if it exists)
   MultipleOptions = false,
   Flag = "LocationDropdown", -- Unique flag for this dropdown
   Callback = function(Option)
       local selectedLocationName = Option[1] -- Get the selected location name
       local selectedLocation = workspace.MouseIgnore.Locations:FindFirstChild(selectedLocationName) -- Find the corresponding location

       if selectedLocation then
           -- Do something with the selected location, e.g., teleport the player
           local player = game.Players.LocalPlayer
           if player and player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
               teleportToLocation(selectedLocation) -- Teleport the player to the location's position
           else
               --updateWeldPart0(selectedLocation) 
           end
       else
           -- warn("The selected location could not be found.")
       end
   end,
})

local player = game.Players.LocalPlayer
local selectedFishZoneName = nil -- Variable to hold the selected fish zone name
-- Function to get the current list of fish zone options
local function updateFishZoneOptions()
    local fishZoneList = {}
    local fishZonesFolder = FFolder

    if fishZonesFolder then
        for _, child in ipairs(fishZonesFolder:GetChildren()) do
            if child:IsA("Folder") and child:FindFirstChildWhichIsA("Part") then
                table.insert(fishZoneList, child.Name)
            elseif child:IsA("Part") then
                table.insert(fishZoneList, child.Name)
            end
        end
    end

    return fishZoneList
end

-- Create the dropdown for selecting fish zones
local FishZoneDropdown = Tab2:CreateDropdown({
    Name = "Select Fish Zone",
    Options = updateFishZoneOptions(), -- Using the list of options generated
    CurrentOption = {updateFishZoneOptions()[1]}, -- Set the first option as default
    MultipleOptions = false,
    Flag = "FISH_ZONE_DDT", -- Unique flag for this dropdown
    Callback = function(Option)
        selectedFishZoneName = Option[1] -- Store the selected fish zone name in the variable
    end,
})

-- Create a button to teleport to the selected fish zone
TeleportToFishZoneButton = Tab2:CreateButton({
    Name = "Teleport to Selected Fish Zone",
    Callback = function()
        if selectedFishZoneName then
            local zone = FFolder:FindFirstChild(selectedFishZoneName)

            local target = nil
            if zone:IsA("Part") then
                target = zone
            elseif zone:IsA("Folder") then
                target = zone:FindFirstChildWhichIsA("Part")
            end

            if target then
                teleportToLocation(target)
            else
                warn("No valid part found to teleport to!")
            end
        else
            warn("No fish zone selected.")
        end
    end,
})

Features & Information

Change weather Clock(Broken) Teleport to player Plot Teleport to plots/players/NPCs Teleport wood/ores, refined/non-refined, boxes to sell or player plot and events if any Perfect Hit Auto Fish Minigame New Method for teleports And More! About the teleports with player: some servers will teleport you back, while others not, not sure why, recommend joining a new server then Revised old script and "remade" this, excluded non working stuff, don't have time, an exploit and accounts to keep testing, accounts I have but keep getting tagged as being an alt, so I can't fully test on same account forever
#Works on free exploits

Community Comments (27)

BigBlue_ScripterBigBlue_ScripterApr 16, 2025

bruh just crashing game

BigBlue_ScripterBigBlue_ScripterApr 16, 2025

bruh it's loaded but it's still trash auto fish is so lazy trash

True_GamerTrue_GamerApr 17, 2025

@BigBlue_Scripter well it should not crash, but now that I went to test, the UI library is having issues. And yeah, the auto fish is just being worked

puxxapuxxaApr 25, 2025

can u fix the resources tp it will always tp on Silver's Sellzone even if you want to tp the resources on plot

puxxapuxxaApr 30, 2025

still no update?

True_GamerTrue_GamerApr 30, 2025

@puxxa I updated it 4 days ago

puxxapuxxaApr 30, 2025(edited)

@lucas, the resources TP is now functioning properly, except for the TP resources to enchant. And can you add "TP resources to Polisher"? oh now the tween to plot or tp to plot is now broken lol sometimes the teleport to places is not working properly

True_GamerTrue_GamerMay 1, 2025(edited)

@puxxa well I never enchanted a tool, so I added the location a long time, didn't check when map updated, btw updated it. Also, polisher can be done too(added too). And TP to plot is broken or semi broken because they updated an anticheat that prevent teleports, but there is a workaround(didn't update this as some servers work without issues)

puxxapuxxaMay 1, 2025(edited)

@True_Gamer thank you yeah the tp is broken on new server but work older server

abdo32rrmabdo32rrmMay 13, 2025

how to use auto fish ?

True_GamerTrue_GamerMay 13, 2025(edited)

@abdo32rrm well it will teleport you(with the legacy method that is your humrootpart cframe to location cframe or car method) to the location and will auto fish there, sometimes it will try to swim and die, so is a good idea jump or keep head out of water, and there is a option that will teleport items(that are inside that green zone) to your plot. There is the option for minigame too, I made it separate because some people may want to fish themselves, so it will not be something perfect, so you may want to toggle it too.

puxxapuxxaMay 14, 2025(edited)

@true_gamer do u have any plans to add more features to the script like pickhaxe having unlimited range

puxxapuxxaMay 14, 2025

the new update causes an FPS drop and why does the tp suck now?

True_GamerTrue_GamerMay 14, 2025

@puxxa don't think is possible to increase range since those are server side stuff. Also the tp is the same as before, game got updated to prevent teleports, that may teleport you back, but the new method solves that

kacperkamola277kacperkamola277May 17, 2025

When will there be an Update and something new?

puxxapuxxaMay 18, 2025

@true_gamer the game just updated, can you check it out? so u can update the script

True_GamerTrue_GamerMay 18, 2025

@puxxa I updated it yesterday, so I guess all the functions are working

kacperkamola277kacperkamola277May 18, 2025

I have a problem that when I teleport any thing to the plot, it returns to the same place

puxxapuxxaJun 10, 2025

@true_gamer, what happened to teleportation? Why are there so many places that are gone

True_GamerTrue_GamerJun 10, 2025(edited)

@puxxa probably devs updated the place I get the teleports, so they aren't added to script, will need to manually add each place. Checking now in game, the script is still running without issues, no missing locations from last time I pla*. Updated script for trees/ores, to work with the car seat.

Replying to @True_Gamer
john_wormjohn_wormApr 5, 2026

@True_Gamer idk if you still update this but velocity crashes after 9-15 mins of executing it, any idea why? is it executor or script related

puxxapuxxaAug 27, 2025

The TP in places is teleporting you to a fishing spot, not mining spot

zarmoneyguyzarmoneyguyJan 25, 2026

we need an update @lucas

atssv2atssv2Feb 8, 2026

@True_Gamer please update

ILoveRC2GamesILoveRC2GamesMar 14, 2026

Hey I Got A Problem Recources tab and teleport tab isnt loading sometimes

puxxapuxxaSep 6, 2026

any plan to update the script?

puxxapuxxaSep 7, 2026

add back the tp to places pls like tp to the Diamanond area

More Scripts for [🐰] Refinery Caves 2