-- [[ 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=6abb1843f86c45ac57aba72d"))() end) end) --[[rscripts:analytics:end]] if not LPH_OBFUSCATED then LPH_ATTRIBUTES = function() end ERROR_HANDLING = function(...) return ... end PRESET = function(...) return ... end OPTIMIZE = function(...) return ... end VM = function(...) return ... end INLINE = function(...) return ... end UNROLL = function(...) return ... end TRANSFORM = function(...) return ... end EXTRACT = function(...) return ... end local _attr = 0 NO_UPVALUES, CONTROL_FLOW, REWRITE_NAMECALLS, GLOBALS, CONSTANTS = _attr, _attr, _attr, _attr, _attr FAST, BALANCED, SECURE, OPAL, ONYX, NONE = _attr, _attr, _attr, _attr, _attr, _attr end LPH_ATTRIBUTES(ERROR_HANDLING(false), OPTIMIZE(2)) local function fetchSource(url) local methods = { function() return request({ Url = url, Method = "GET" }) end, function() return http_request({ Url = url, Method = "GET" }) end, function() return (syn and syn.request)({ Url = url, Method = "GET" }) end, function() return game:HttpGet(url) end, } for _, fn in ipairs(methods) do local ok, res = pcall(fn) if ok then local body = type(res) == "table" and res.Body or res if type(body) == "string" and body ~= "" then return body end end end return nil end local FLUENT_URL = "https://github.com/StyearX/Fluent-Modded/releases/download/1.6.0/main.lua" local Fluent do local src = fetchSource(FLUENT_URL) if src then local ok, res = pcall(function() return loadstring(src)() end) if ok then Fluent = res end end end if not Fluent then warn("[Shogun Hub] Failed to load Fluent UI. Your executor's game:HttpGet likely cannot follow GitHub's 302 redirect. Enable request/http_request or use a redirect-capable executor.") return end local Players = game:GetService("Players") local RS = game:GetService("ReplicatedStorage") local VIM = game:GetService("VirtualInputManager") local UIS = game:GetService("UserInputService") local plr = Players.LocalPlayer local EV = RS:FindFirstChild("Events") or RS:WaitForChild("Events", 8) local touchOnly = UIS.TouchEnabled and not UIS.KeyboardEnabled local rcache = {} local function rem(n) local c = rcache[n] if c and c.Parent then return c end if not EV then return nil end for _, d in ipairs(EV:GetDescendants()) do if d.Name == n and (d:IsA("RemoteEvent") or d:IsA("RemoteFunction")) then rcache[n] = d return d end end return nil end local docsRem = rem("Documents") local prog = rem("ProgressionRemote") local function ensureRemotes() if not docsRem then docsRem = rem("Documents") end if not prog then prog = rem("ProgressionRemote") end end for _ = 1, 15 do ensureRemotes() if docsRem and prog then break end task.wait(0.2) end local DocsData pcall(function() DocsData = require(RS.Modules.DocumentsData) end) local G = (getgenv and getgenv()) or _G G.ShogunDocs = G.ShogunDocs or {} local S = G.ShogunDocs S.RunId = (S.RunId or 0) + 1 local RUN = S.RunId local function alive() return S.RunId == RUN end if type(S.Conns) == "table" then for _, c in ipairs(S.Conns) do pcall(function() c:Disconnect() end) end end S.Conns = {} S.AutoDocuments = S.AutoDocuments == true S.DocAutoReset = S.DocAutoReset == true S.Humanize = S.Humanize == true S.Telemetry = S.Telemetry ~= false S.NoTeleport = S.NoTeleport == true S.Fullbright = S.Fullbright == true S.AntiAfk = S.AntiAfk == true S.Webhook = S.Webhook or "" S.Status = "idle" S.DocWaitMode = "None" S.Busy = false S.DocOpen = false S.Stats = S.Stats or { docs = 0 } if S.Stats.docs == nil then S.Stats.docs = 0 end local ST = S.Stats local function jit(base) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) if S.Humanize then return base * (0.8 + math.random() * 0.4) end return base end local function sendWebhook(content) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local url = tostring(S.Webhook or "") if url == "" then return end local body local okJson, encoded = pcall(function() return game:GetService("HttpService"):JSONEncode({ content = tostring(content) }) end) if okJson and type(encoded) == "string" then body = encoded else body = string.format('{"content":%q}', tostring(content)) end local fns = { request, http_request, httprequest, syn and syn.request, http and http.request } for _, fn in ipairs(fns) do if type(fn) == "function" then local ok = pcall(function() fn({ Url = url, Method = "POST", Headers = { ["Content-Type"] = "application/json" }, Body = body }) end) if ok then return end pcall(function() fn(url, body) end) return end end end local GUINAMES = { "FluentPro", "FluentProScroll", "FluentProPopup", "ShogunHub", "ShogunHubScroll", "ShogunHubPopup", "ShogunDocsUI" } local function eachRoot(f) local seen, roots = {}, {} if type(gethui) == "function" then local ok, h = pcall(gethui) if ok and h then roots[#roots + 1] = h end end local ok, cg = pcall(function() return game:GetService("CoreGui") end) if ok and cg then roots[#roots + 1] = cg end local pg = plr:FindFirstChild("PlayerGui") if pg then roots[#roots + 1] = pg end for _, r in ipairs(roots) do if not seen[r] then seen[r] = true; pcall(f, r) end end end eachRoot(function(r) for _, n in ipairs(GUINAMES) do local g = r:FindFirstChild(n) if g then g:Destroy() end end end) local cachedMain local function getMainUI() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) if cachedMain and cachedMain.Parent then return cachedMain end local pg = plr:FindFirstChild("PlayerGui") cachedMain = pg and pg:FindFirstChild("MainUI") return cachedMain end local function getChar() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local ch = plr.Character local hum = ch and ch:FindFirstChildOfClass("Humanoid") local hrp = ch and ch:FindFirstChild("HumanoidRootPart") if ch and hum and hrp then return ch, hum, hrp end return nil end local _seatProbe = OverlapParams.new() _seatProbe.FilterType = Enum.RaycastFilterType.Exclude local function seatNear(p, r) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) _seatProbe.FilterDescendantsInstances = { plr.Character } for _, inst in ipairs(workspace:GetPartBoundsInRadius(p, r, _seatProbe)) do if inst:IsA("Seat") then return true end end return false end local function freeLandNear(pos) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local rp = RaycastParams.new() rp.FilterType = Enum.RaycastFilterType.Exclude rp.FilterDescendantsInstances = { plr.Character } for _, off in ipairs({ Vector3.new(0, 0, 0), Vector3.new(6, 0, 0), Vector3.new(-6, 0, 0), Vector3.new(0, 0, 6), Vector3.new(0, 0, -6), Vector3.new(5, 0, 5), Vector3.new(-5, 0, -5), Vector3.new(5, 0, -5), Vector3.new(-5, 0, 5) }) do local o = pos + off local r = workspace:Raycast(Vector3.new(o.X, pos.Y + 6, o.Z), Vector3.new(0, -80, 0), rp) local hitSeat = r and r.Instance and r.Instance:IsA("Seat") if not hitSeat then local land = r and (r.Position + Vector3.new(0, 3, 0)) or (o + Vector3.new(0, 3, 0)) if not seatNear(land, 4) then return land end end end return nil end local function standUp() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local ch, hum, hrp = getChar() if not hum then return false end if hum.Sit then hum.Sit = false pcall(function() hum:ChangeState(Enum.HumanoidStateType.GettingUp) end) end if hrp and ch and (hum.SeatPart or seatNear(hrp.Position, 3)) then local land = freeLandNear(hrp.Position) if land and (hrp.Position - land).Magnitude > 3 then pcall(function() ch:PivotTo(CFrame.new(land)) end) task.wait(0.2) end end return true end local function getEnergy() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local st = plr.Character and plr.Character:FindFirstChild("Stats") return st and st:GetAttribute("Energy") end local function getSubrole() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local st = plr.Character and plr.Character:FindFirstChild("Stats") return st and st:GetAttribute("Subrole") end local function getLocalSupply(kind) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local ls = plr:FindFirstChild("LocalSupply") return ls and ls:GetAttribute(kind) end local function docsHasPaper() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) return (tonumber(getLocalSupply("Documents")) or 0) > 0 end local _lastTpAt = 0 local function teleportTo(pos) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) if S.NoTeleport then return false end local ch, _, hrp = getChar() if not ch or not hrp then return false end local land = freeLandNear(pos) if not land then return false end if (hrp.Position - land).Magnitude < 3 then return true end if os.clock() - _lastTpAt < 0.25 then return false end _lastTpAt = os.clock() ch:PivotTo(CFrame.new(land)) return true end local function getDocsFolder() local w = workspace:FindFirstChild("World") local inter = w and w:FindFirstChild("Interactables") return inter and inter:FindFirstChild("Documents") end local function getDocsPos() local folder = getDocsFolder() local base = folder and folder:FindFirstChildWhichIsA("BasePart", true) return base and base.Position end local function goToDocs() local pos = getDocsPos() if pos then teleportTo(pos) end return pos end local function findButtonByText(root, text) for _, d in ipairs(root:GetDescendants()) do if d:IsA("TextButton") and d.Visible then local t pcall(function() t = d.Text end) if t == text then return d end end end return nil end local function clickButton(btn) if not btn then return false end if type(getconnections) == "function" then local ok = false for _, c in ipairs(getconnections(btn.Activated)) do pcall(function() c.Function() end) ok = true end if ok then return true end end if type(firesignal) == "function" then if pcall(firesignal, btn.Activated) then return true end end local p, z = btn.AbsolutePosition, btn.AbsoluteSize local x, y = math.floor(p.X + z.X / 2), math.floor(p.Y + z.Y / 2) pcall(function() VIM:SendMouseButtonEvent(x, y, 0, true, game, 0) end) task.wait(0.05) pcall(function() VIM:SendMouseButtonEvent(x, y, 0, false, game, 0) end) return true end local function dismissPopup() local main = getMainUI() if not main then return false end for _, p in ipairs(main:GetChildren()) do local win = p:FindFirstChild("Window") local content = win and win:FindFirstChild("Content") if content and content:IsA("TextLabel") then if content.Text:lower():find("shogun") then local no = findButtonByText(win, "No") if no then clickButton(no); return true end end end end return false end local function numFrom(s) return tonumber(tostring(s):match("(-?%d+)")) end local function capName(s) return (tostring(s):gsub("[%s%.]+$", "")) end local DOC_DISTRICTS = {} local DOC_PETS = {} if DocsData and type(DocsData.DISTRICTS) == "table" then for _, d in ipairs(DocsData.DISTRICTS) do if type(d) == "table" and d.name then DOC_DISTRICTS[d.name] = true end end end if DocsData and type(DocsData.PETITIONS) == "table" then for _, pet in ipairs(DocsData.PETITIONS) do local details = {} if type(pet.details) == "table" then for i, det in ipairs(pet.details) do if type(det) == "table" and type(det.claim) == "string" then details[i] = (det.claim:gsub("%%s", "(.+)")) end end end DOC_PETS[#DOC_PETS + 1] = { ask = type(pet.ask) == "string" and (pet.ask:gsub("%%d", "%%d+")) or "", authority = pet.authority == true, details = details, } end end local function parseRecords(records) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local districts, info, last = {}, {}, nil for _, r in ipairs(records or {}) do if type(r) == "table" then local entry, value = tostring(r[1] or ""), tostring(r[2] or "") if entry == "Signed on" then info.signedDay = numFrom(value) elseif entry == "Today is" then info.today = numFrom(value) elseif entry == "Times they wrote before" then local m = tonumber(value:match("%-?%d+")) if m == nil then local w = { none = 0, never = 0, once = 1, twice = 2, thrice = 3 } m = w[(value:lower():gsub("%s+", ""))] end info.times = m elseif entry:sub(1, 6) == "head: " then if last then last.head = entry:sub(7) last.houses = numFrom(value) end elseif DOC_DISTRICTS[entry] then local dist = { glyph = value:match("^(%S+)"), tax = numFrom(value) } districts[entry] = dist last = dist end end end return districts, info end local function detailTruth(text, n, bodyNums) for _, pet in ipairs(DOC_PETS) do for i, pat in ipairs(pet.details) do if pat and text:match(pat) then return n ~= nil and bodyNums[i] ~= nil and n == bodyNums[i] end end end return nil end local function solveDocs(d) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) local districts, info = parseRecords(d.records) local bodyNums = {} for n in (tostring(d.body or ""):gsub("<[^>]*>", "")):gmatch("%d+") do bodyNums[#bodyNums + 1] = tonumber(n) end local ask = tostring(d.ask or "") local authority for _, pet in ipairs(DOC_PETS) do if pet.ask ~= "" and ask:match(pet.ask) then authority = pet.authority; break end end local claims = d.claims or {} local marks, anyFalse, unknown = {}, false, {} for i = 1, math.max(#claims, 3) do local claim = claims[i] if claim == nil then marks[i] = nil else local text = tostring(claim) local n = numFrom(text) local truth local a, b = text:match("^(.-) is the head of (.+)%.?$") if a then local dist = districts[capName(b)] truth = dist ~= nil and dist.head == capName(a) else a, b = text:match("^(.-) has (%-?%d+) houses%.?$") if a then local dist = districts[capName(a)] truth = dist ~= nil and dist.houses == tonumber(b) else a, b = text:match("^(.-) paid (%-?%d+) Ryo in tax%.?$") if a then local dist = districts[capName(a)] truth = dist ~= nil and dist.tax == tonumber(b) else a = text:match("seal belongs to (.+)%.?$") if a then local dist = districts[capName(a)] truth = dist ~= nil and dist.glyph == d.sealGlyph else a = text:match("[Ss]igned on day (%-?%d+)") if a then truth = info.signedDay ~= nil and info.signedDay == tonumber(a) else a = text:match("[Tt]oday is day (%-?%d+)") if a then truth = info.today ~= nil and info.today == tonumber(a) else a, b = text:match("^(.-) has written in (%S+)") if a then local words = { once = 1, twice = 2, thrice = 3 } local m = tonumber(b) or words[tostring(b):lower()] truth = m ~= nil and info.times ~= nil and info.times == m else a = text:match("^(.-) has not written in") if a then truth = info.times ~= nil and info.times == 0 else truth = detailTruth(text, n, bodyNums) end end end end end end end end if truth == nil then unknown[#unknown + 1] = text truth = true end marks[i] = truth if truth == false then anyFalse = true end end end local aut = authority if aut == nil then aut = true end local ruling = anyFalse and "Deny" or (aut and "Grant" or "Refer") if #unknown > 0 then print("[Shogun Docs] unknown claim: " .. unknown[1]) end return marks, ruling end S.solveDocs = solveDocs S.parseRecords = parseRecords local function changeRole(team, subrole, display) if not team or team == "" then return false end local p = rem("ProgressionRemote") if not p then return false end pcall(function() p:FireServer("ChangeRole", team, subrole or "", display or "") end) return true end local function doReset(manual) if S.Busy then return false end S.Busy = true; S.BusyAt = os.clock() local ok, res = pcall(function() local ch, hum, hrp = getChar() if not ch or not hum then return false end S.Status = manual and "Switching role" or "Resetting (energy)" local cf = hrp.CFrame local teamName = (plr.Team and plr.Team.Name) or "Feudal Noble" local stats = ch:FindFirstChild("Stats") local curSub = (stats and stats:GetAttribute("Subrole")) or "" local curDisp = (stats and stats:GetAttribute("SubroleDisplay")) or "" local wantTeam = (S.TargetTeam ~= "" and S.TargetTeam) or teamName local wantSub = (S.TargetSubrole ~= "" and S.TargetSubrole) or curSub local wantDisp = (S.TargetSubrole ~= "" and (S.TargetDisplay or "")) or curDisp local newChar local conn = plr.CharacterAdded:Connect(function(c) newChar = c end) pcall(function() hum.Health = 0 end) local t0 = os.clock() while not newChar and os.clock() - t0 < 20 do task.wait(0.1) end if conn then conn:Disconnect() end if not newChar then S.Status = "Reset timeout" return false end local m = getMainUI() for _, nm in ipairs({ "SavePicker", "PlayMenu", "Selection", "Death", "Customization" }) do local g = m and m:FindFirstChild(nm) if g then local okv, v = pcall(function() return g.Visible end) if okv and v then g.Visible = false end end end local newStats = newChar and newChar:WaitForChild("Stats", 10) task.wait(0.5) if newStats and (newStats:GetAttribute("Subrole") ~= wantSub or teamName ~= wantTeam) then changeRole(wantTeam, wantSub, wantDisp) S.Status = "Choosing " .. tostring(wantSub) local t3 = os.clock() while os.clock() - t3 < 8 and newStats:GetAttribute("Subrole") ~= wantSub do task.wait(0.2) end end task.wait(0.4) local back = plr.Character if back and not S.NoTeleport then pcall(function() back:PivotTo(cf) end) end S.Status = manual and "Role switch done" or "Reset done" return true end) S.Busy = false return ok and res == true end S.Reset = doReset do local docs = docsRem if docs then local lastFp, lastFpT local function docsPanel() local main = getMainUI() return main and main:FindFirstChild("Documents") end local function hideGuide() local d = docsPanel() local g = d and d:FindFirstChild("Guide") if g and g.Visible then g.Visible = false end end local function readGuide() hideGuide() pcall(function() docs:FireServer("GuideRead") end) end table.insert(S.Conns, docs.OnClientEvent:Connect(function(action, ...) LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) if not alive() or not S.AutoDocuments then return end if action == "Guide" then readGuide() return end if action == "Verdict" then S.DocCaseAt = os.clock() local v = ... if type(v) == "table" then if v.ruledCorrectly and not v.contradicted then S.DocWrongStreak = 0 elseif not v.timedOut then S.DocWrongStreak = (S.DocWrongStreak or 0) + 1 if S.DocWrongStreak >= 3 then S.AutoDocuments = false S.Status = "Documents: paused (3 wrong)" pcall(function() Fluent:Notify({ Title = "Documents", Content = "Paused after 3 wrong to avoid the 5-strike bar.", Duration = 8 }) end) pcall(sendWebhook, "**Documents**: paused after 3 wrong answers (safety).") end end if v.barred then S.Status = "Documents: barred" S.DocWrongStreak = 0 pcall(function() Fluent:Notify({ Title = "Documents", Content = "Barred by the clerk (5 wrong). Waiting it out.", Duration = 6 }) end) pcall(sendWebhook, "**Documents**: barred by the clerk (5 wrong).") end end return end if action == "Closed" then S.DocOpen = false return end if action ~= "Case" then return end local _, _, caseData = ... if type(caseData) ~= "table" then return end local cl = caseData.claims or {} local fp = tostring(caseData.ask) .. "|" .. tostring(caseData.from) .. "|" .. tostring(caseData.sealGlyph) .. "|" .. tostring(cl[1]) .. "|" .. tostring(cl[2]) .. "|" .. tostring(cl[3]) if fp == lastFp and (os.clock() - (lastFpT or -99)) < 3 then return end lastFp, lastFpT = fp, os.clock() S.DocOpen = true S.DocCaseAt = os.clock() hideGuide() task.defer(function() local marks, ruling = solveDocs(caseData) if docs.Parent then pcall(function() docs:FireServer("Rule", marks, ruling) end) ST.docs = ST.docs + 1 S.Status = "Document: " .. tostring(ruling) end end) end)) local function docsPrompt() local folder = getDocsFolder() if not folder then return nil end local _, _, hrp = getChar() if not hrp then return nil end local best, bd for _, d in ipairs(folder:GetDescendants()) do if d:IsA("ProximityPrompt") and d.Enabled then local bp = d:FindFirstAncestorWhichIsA("BasePart") if bp then local dist = (bp.Position - hrp.Position).Magnitude if not bd or dist < bd then best, bd = d, dist end end end end if best and bd <= 14 then return best end return nil end local function triggerPrompt(pr) if not pr then return end pcall(function() pr:InputHoldBegin() task.wait(math.max(pr.HoldDuration or 0, 0.05)) pr:InputHoldEnd() end) end task.spawn(function() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) while alive() do if S.DocOpen and os.clock() - (S.DocCaseAt or 0) > 60 then S.DocOpen = false end if S.AutoDocuments and not S.Busy then if not docsHasPaper() then if S.DocWaitMode == "None" then S.Status = "Documents: waiting for paper" end elseif (plr.Team and plr.Team.Name) ~= "Feudal Noble" then if not S.LastDocRole or os.clock() - S.LastDocRole > 5 then S.LastDocRole = os.clock() changeRole("Feudal Noble", "", "") S.Status = "Selecting Feudal Noble" end else hideGuide() local pr = docsPrompt() if pr and not S.DocOpen then triggerPrompt(pr) elseif not pr and not S.DocOpen and (not S.LastDocTp or os.clock() - S.LastDocTp > 3) then S.LastDocTp = os.clock() goToDocs() end end end task.wait(jit(1.2)) end end) task.spawn(function() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) while alive() do if S.AutoDocuments and S.DocAutoReset and not S.Busy and docsHasPaper() then local e = getEnergy() if type(e) == "number" and e <= 15 and (not S.LastDocReset or os.clock() - S.LastDocReset > 25) then S.LastDocReset = os.clock() local oT, oS, oD = S.TargetTeam, S.TargetSubrole, S.TargetDisplay S.TargetTeam, S.TargetSubrole, S.TargetDisplay = "Feudal Noble", "", "" goToDocs() doReset(false) S.TargetTeam, S.TargetSubrole, S.TargetDisplay = oT, oS, oD task.wait(0.4) goToDocs() end end task.wait(jit(1)) end end) end end task.spawn(function() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) while alive() do pcall(dismissPopup) task.wait(jit(1)) end end) task.spawn(function() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) while alive() do if S.AntiAfk then pcall(function() local vu = game:GetService("VirtualUser") vu:CaptureController() vu:ClickButton2(Vector2.new()) end) end task.wait(240) end end) local winCfg = { Title = "Shogun Hub", SubTitle = "by LeafLeaf", TabWidth = 150, Size = touchOnly and UDim2.fromOffset(440, 400) or UDim2.fromOffset(580, 560), Acrylic = not touchOnly, Theme = "Dark", ScreenGuiName = "ShogunHub", } if not touchOnly then winCfg.MinimizeKey = Enum.KeyCode.RightShift end local Window = Fluent:CreateWindow(winCfg) local Tabs = { Docs = Window:AddTab({ Title = "Documents", Icon = "scroll" }), Settings = Window:AddTab({ Title = "Settings", Icon = "settings" }), } local function notify(t, c) pcall(function() Fluent:Notify({ Title = t, Content = c, Duration = 4 }) end) end local SecDocs = Tabs.Docs:AddSection("Documents", "scroll") SecDocs:AddToggle("AutoDocuments", { Title = "Auto Documents", Description = "Teleports to the desk and auto-answers the judging minigame", Default = S.AutoDocuments, Callback = function(v) if v == S.AutoDocuments then return end S.AutoDocuments = v if v then S.TargetTeam = "Feudal Noble" S.TargetSubrole = "" S.TargetDisplay = "" task.spawn(function() if (plr.Team and plr.Team.Name) ~= "Feudal Noble" then changeRole("Feudal Noble", "", "") task.wait(1.5) end goToDocs() end) notify("Documents", "Teleported to the desk") end end }) SecDocs:AddToggle("DocAutoReset", { Title = "Auto Reset when tired", Description = "Respawn on low energy, then return to the Documents desk", Default = S.DocAutoReset, Callback = function(v) S.DocAutoReset = v end }) SecDocs:AddParagraph({ Title = "Note", Content = "Checks every claim type (seal, head, houses, tax, date, letters, and petition numbers) against the case records; rulings follow Deny/Grant/Refer. Pauses after 3 wrong to avoid the 5-strike bar." }) local StatusPara = Tabs.Docs:AddSection("Status", "activity"):AddParagraph({ Title = "Live", Content = "idle" }) task.spawn(function() LPH_ATTRIBUTES(VM(NONE), TRANSFORM(EXTRACT(GLOBALS, CONSTANTS), REWRITE_NAMECALLS)) while alive() and StatusPara do if S.Busy and S.BusyAt and os.clock() - S.BusyAt > 45 then S.Busy = false; S.BusyAt = nil end local e = getEnergy() pcall(function() StatusPara:SetDesc(string.format( "%s\nPaper %s | Energy %s | Docs %d", tostring(S.Status or "idle"), tostring(getLocalSupply("Documents") or 0), type(e) == "number" and tostring(math.floor(e)) or "-", math.floor(ST.docs or 0))) end) task.wait(0.5) end end) local SecSet = Tabs.Settings:AddSection("Session", "settings") SecSet:AddToggle("Humanize", { Title = "Humanize timing", Description = "Adds +/-20% jitter to loop delays to avoid robotic patterns", Default = S.Humanize, Callback = function(v) S.Humanize = v end }) SecSet:AddToggle("AntiAfk", { Title = "Anti-AFK", Description = "Nudges the client every ~4 min so Roblox won't idle-kick you", Default = S.AntiAfk, Callback = function(v) S.AntiAfk = v end }) SecSet:AddToggle("NoTeleport", { Title = "Disable teleport (anti-ban)", Description = "Blocks every character teleport. For public servers.", Default = S.NoTeleport, Callback = function(v) S.NoTeleport = v end }) SecSet:AddInput("Webhook", { Title = "Discord webhook URL", Placeholder = "https://discord.com/api/webhooks/...", Default = S.Webhook, Finished = true, Callback = function(v) S.Webhook = v end }) SecSet:AddButton({ Title = "Unload script", Callback = function() pcall(sendWebhook, string.format("**Documents session ended** (%s) - Docs: %d", plr.Name, math.floor(ST.docs or 0))) S.RunId = (S.RunId or 0) + 1 for _, c in ipairs(S.Conns) do pcall(function() c:Disconnect() end) end S.Conns = {} pcall(function() Window:Destroy() end) eachRoot(function(r) for _, n in ipairs(GUINAMES) do local g = r:FindFirstChild(n) if g then g:Destroy() end end end) end, }) Fluent:Notify({ Title = "Shogun Hub", Content = "Loaded (DocumentsOnly). Made by LeafLeaf.", Duration = 4 })