-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] --[[rscripts:analytics:start]] -- Script analytics (enabled by the creator on rscripts.net). -- Runs in its own thread and cannot affect the script below. task.spawn(function() pcall(function() loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6ab594b677e889f15199c5b2"))() end) end) --[[rscripts:analytics:end]] local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local plr = Players.LocalPlayer local fishingRemote = ReplicatedStorage:WaitForChild("Events"):WaitForChild("Activities"):WaitForChild("Fishing") -- Edit config here local CONFIG = { CastRetryDelay = 1.0, -- pause between casts CastTimeout = 20, -- max seconds to wait for Bite/CastEnded SpotMaxDist = 12, -- max distance to fire prompt from } getgenv().AutoFish = false getgenv().NeedsSleep = false getgenv().ShogunRunId = (getgenv().ShogunRunId or 0) + 1 local RUN_ID = getgenv().ShogunRunId local function stillMine() return getgenv().ShogunRunId == RUN_ID end if type(getgenv().ShogunConns) == "table" then for _, c in ipairs(getgenv().ShogunConns) do pcall(function() c:Disconnect() end) end end getgenv().ShogunConns = {} local function getPrompt() local folder = workspace:FindFirstChild("World") and workspace.World:FindFirstChild("Interactables") and workspace.World.Interactables:FindFirstChild("Fish") if not folder then return nil, nil, math.huge end local plrChar = plr.Character local hrp = plrChar and plrChar:FindFirstChild("HumanoidRootPart") if not hrp then return nil, nil, math.huge end local best, bestPrompt, bestDist for _, spot in ipairs(folder:GetChildren()) do if spot:IsA("BasePart") then local d = (spot.Position - hrp.Position).Magnitude if not bestDist or d < bestDist then best = spot bestDist = d bestPrompt = spot:FindFirstChildOfClass("ProximityPrompt") end end end return bestPrompt, best, bestDist end local function ensureRodEquipped() local ch = plr.Character if not ch then return end local hum = ch:FindFirstChildOfClass("Humanoid") if not hum then return end local held = ch:FindFirstChildOfClass("Tool") if held and held.Name:lower():find("rod") then return end local rod for _, tool in ipairs(plr.Backpack:GetChildren()) do if tool:IsA("Tool") and tool.Name:lower():find("rod") then rod = tool break end end if rod then hum:EquipTool(rod) task.wait(0.4) return end local function countFish() local n = 0 for _, t in ipairs(plr.Backpack:GetChildren()) do if t.Name == "Fish" then n = n + 1 end end return n end local fishN = countFish() if fishN >= 8 then pcall(function() ReplicatedStorage.Events.Economy.Shop:FireServer("Sell", "Takeshi", { Fish = fishN }) end) task.wait(0.5) end rod = nil for _, tool in ipairs(plr.Backpack:GetChildren()) do if tool:IsA("Tool") and tool.Name:lower():find("rod") then rod = tool break end end if not rod and not (ch:FindFirstChildOfClass("Tool") and ch:FindFirstChildOfClass("Tool").Name:lower():find("rod")) then pcall(function() ReplicatedStorage.Events.Economy.Shop:FireServer("Buy", "Takeshi", { ["Best Fishing Rod"] = 1 }) end) task.wait(1.0) for _, tool in ipairs(plr.Backpack:GetChildren()) do if tool:IsA("Tool") and tool.Name:lower():find("rod") then rod = tool break end end if not rod then for _, tool in ipairs(ch:GetChildren()) do if tool:IsA("Tool") and tool.Name:lower():find("rod") then return end end end end if rod then hum:EquipTool(rod) task.wait(0.4) end end local events = {} local eventsDirty = false table.insert(getgenv().ShogunConns, fishingRemote.OnClientEvent:Connect(function(action, data) if not stillMine() then return end local token = type(data) == "table" and data.token or nil events[#events + 1] = { action = action, token = token } eventsDirty = true if action == "Bite" and token then pcall(function() fishingRemote:FireServer("Result", true, token) end) end end)) do local thoughtRemote for _, d in ipairs(ReplicatedStorage.Events:GetDescendants()) do if d.Name == "CreateThought" and d:IsA("RemoteEvent") then thoughtRemote = d break end end if thoughtRemote then table.insert(getgenv().ShogunConns, thoughtRemote.OnClientEvent:Connect(function(msg) if not stillMine() then return end if type(msg) == "string" and msg:lower():find("tired") then getgenv().NeedsSleep = true end end)) end end task.spawn(function() if not stillMine() then return end local stats = { casts = 0, caught = 0, misses = 0, sleeps = 0 } getgenv().FishStats = stats while stillMine() do if not getgenv().AutoFish then eventsDirty = false task.wait(0.1) continue end if getgenv().NeedsSleep then goToSleep() stats.sleeps = stats.sleeps + 1 end ensureRodEquipped() local prompt, spot, dist = getPrompt() if prompt and dist <= CONFIG.SpotMaxDist then events = {} eventsDirty = false local ok = pcall(fireproximityprompt, prompt) if ok then stats.casts = stats.casts + 1 end local t0 = os.clock() local gotBite, resolved = false, false while os.clock() - t0 < CONFIG.CastTimeout and stillMine() and getgenv().AutoFish and not resolved and not getgenv().NeedsSleep do if eventsDirty then eventsDirty = false for _, e in ipairs(events) do if e.action == "Bite" then gotBite = true end if e.action == "CastEnded" then resolved = true end end end task.wait(0.05) end if gotBite then stats.caught = stats.caught + 1 elseif resolved then stats.misses = stats.misses + 1 end else if not prompt then warn("[AutoFish] no fishing spot found") else warn("[AutoFish] no prompt in range (dist=" .. tostring(dist) .. ")") end task.wait(CONFIG.CastRetryDelay) end task.wait(CONFIG.CastRetryDelay) end end) local function buildUI() local guiName = "ShogunToggleUI" local old = plr:FindFirstChild("PlayerGui") and plr.PlayerGui:FindFirstChild(guiName) if old then old:Destroy() end local pg = plr:WaitForChild("PlayerGui") local gui = Instance.new("ScreenGui") gui.Name = guiName gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = pg local frame = Instance.new("Frame") frame.Name = "Main" frame.Size = UDim2.fromOffset(200, 110) frame.Position = UDim2.new(0, 16, 0.5, -55) frame.BackgroundColor3 = Color3.fromRGB(22, 22, 28) frame.BorderSizePixel = 0 frame.Active = true frame.Draggable = true frame.Parent = gui local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 8) corner.Parent = frame local stroke = Instance.new("UIStroke") stroke.Color = Color3.fromRGB(70, 70, 90) stroke.Thickness = 1 stroke.Parent = frame local title = Instance.new("TextLabel") title.Name = "Title" title.Size = UDim2.new(1, 0, 0, 32) title.BackgroundColor3 = Color3.fromRGB(32, 32, 42) title.BorderSizePixel = 0 title.Font = Enum.Font.GothamBold title.Text = "Shogun Tools" title.TextColor3 = Color3.fromRGB(235, 235, 245) title.TextSize = 14 title.Parent = frame local titleCorner = Instance.new("UICorner") titleCorner.CornerRadius = UDim.new(0, 8) titleCorner.Parent = title local titleFix = Instance.new("Frame") titleFix.Size = UDim2.new(1, 0, 0, 10) titleFix.Position = UDim2.new(0, 0, 1, -10) titleFix.BackgroundColor3 = title.BackgroundColor3 titleFix.BorderSizePixel = 0 titleFix.Parent = title local function makeToggle(name, labelText, y, getFlag) local btn = Instance.new("TextButton") btn.Name = name btn.Size = UDim2.new(1, -24, 0, 36) btn.Position = UDim2.new(0, 12, 0, y) btn.BackgroundColor3 = Color3.fromRGB(40, 40, 52) btn.BorderSizePixel = 0 btn.Font = Enum.Font.GothamSemibold btn.TextSize = 13 btn.TextColor3 = Color3.fromRGB(235, 235, 245) btn.AutoButtonColor = true btn.Parent = frame local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, 6) c.Parent = btn local stateLabel = Instance.new("TextLabel") stateLabel.Name = "State" stateLabel.Size = UDim2.new(0, 52, 1, 0) stateLabel.Position = UDim2.new(1, -60, 0, 0) stateLabel.BackgroundTransparency = 1 stateLabel.Font = Enum.Font.GothamBold stateLabel.TextSize = 12 stateLabel.TextXAlignment = Enum.TextXAlignment.Right stateLabel.Parent = btn local function refresh() local on = getFlag() == true btn.Text = labelText btn.TextXAlignment = Enum.TextXAlignment.Left btn.TextTransparency = on and 0 or 0.35 stateLabel.Text = on and "ON" or "OFF" stateLabel.TextColor3 = on and Color3.fromRGB(90, 220, 130) or Color3.fromRGB(220, 90, 90) end refresh() return btn, refresh end local btnFish, refreshFish = makeToggle("FishBtn", "Auto Fish", 44, function() return getgenv().AutoFish end) btnFish.Activated:Connect(function() getgenv().AutoFish = not getgenv().AutoFish refreshFish() end) local statsLabel = Instance.new("TextLabel") statsLabel.Name = "Stats" statsLabel.Size = UDim2.new(1, -24, 0, 24) statsLabel.Position = UDim2.new(0, 12, 1, -30) statsLabel.BackgroundTransparency = 1 statsLabel.Font = Enum.Font.Gotham statsLabel.TextSize = 11 statsLabel.TextColor3 = Color3.fromRGB(160, 160, 180) statsLabel.TextXAlignment = Enum.TextXAlignment.Left statsLabel.Text = "casts 0 | caught 0" statsLabel.Parent = frame task.spawn(function() while gui.Parent and stillMine() do refreshFish() local s = getgenv().FishStats if s then statsLabel.Text = string.format( "casts %d | caught %d | miss %d | sleep %d", s.casts or 0, s.caught or 0, s.misses or 0, s.sleeps or 0 ) end task.wait(0.5) end end) return gui end buildUI()