Refinery Caves 2 Script

Refinery Caves 2 Script is a helpful Roblox script designed to improve exploration and survival inside the Refinery Caves 2 game. It enhances gameplay with resource detection, movement assistance, hazard awareness, and grind reduction, making cave exploration safer and more efficient.

What is Refinery Caves 2 Script?

Refinery Caves 2 Script is a Roblox automation tool that assists players while navigating dangerous cave systems. It helps reduce the difficulty of finding resources, avoiding hazards, and moving through complex cave layouts, especially during long play sessions.

Refinery Caves 2 Script

Features Of Refinery Caves 2 Script

1

Resource Detection Support

Helps identify valuable ores and resources inside caves.

2

Movement Speed Assistance

Improves movement speed for faster and smoother cave navigation.

3

Hazard Awareness Aid

Assists in avoiding dangerous areas, traps, and sudden threats.

Download & Copy All Refinery Caves 2 Script 2025

1. Refinery Caves 2 Script

--[[
WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk!
]]
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,
})

Also Read: Natural Disaster Survival Script

How to use Refinery Caves 2 Script

Use the script by following these steps:

  • Install a trusted Roblox script executor
  • Open Roblox and join the Refinery Caves 2 game
  • Wait for the cave environment and character to fully load
  • Open your script executor
  • Copy the Refinery Caves 2 Script code
  • Paste it into the executor input box
  • Click Execute / Inject to activate the script
  • Enable resource or movement features as needed
  • Adjust settings carefully to avoid unnatural movement
  • Disable features when entering safe zones or lobbies

Frequently Asked Questions (FAQs)

Is Lumber Tycoon 2 Script easy to use?

Can I disable features during gameplay?

Does the script help find rare resources?

Will this script cause lag or crashes?

No, optimized scripts run smoothly.

Is there a ban risk when using Refinery Caves 2 Script?

Conclusion

Refinery Caves 2 Script is ideal for players who want a smoother and less stressful cave exploration experience. By assisting with resource detection and movement, it reduces unnecessary risks and saves time. When used responsibly, the script enhances efficiency while keeping the challenge and excitement of cave exploration intact.

Leave a Comment