(Open Source)Working Auto Doc For Latest Update!
[将] Shogun's ReignDescription
--RIGHT SHIFT TO OPEN AND CLOSE THE GUI --DELETE KEY TO UNLOAD IT -- AFTER YOU RUN IT YOU HAVE TO PRESS START YOURSELF IF YOU WANT TO SEE THE LETTERS IF NOT IT WILL STILL DO THE DOCS FOR YOU Solves documents for you, automatically. Opens the table, reads the case, checks the claims against the records, and sends the right ruling — Grant, Deny, or Refer. Auto-walks/teleports you to the docs table and presses E for you, so it loops case after case on its own. Auto-switches you to Feudal Noble since that's the role you need to touch documents. Handles the Guide popups and closes stale cases so it never gets stuck. Panel with a few toggles and live stats (cases done, matches, misses, reward, speed). RightShift opens it, Delete unloads. Optional logging to a file if you want to check its work. This script is MY LAST SCRIPT FOR SHOGUN'S REIGN. I will not be working on this game anymore. I had a working AutoParry and AutoDash that I was going to add to my main script, it was hella op, but the new update they dropped ruined it. It still works with the katana, but the new weapon is so broken I cannot get it to work as well as it did when the katana was the only weapon in the game, and the update to the combat system in general is so bad it's not even fun anymore, so I'm done with this game to move on to another. Thank you all for using my main script! I had fun making it (who knows, maybe if they fix the combat and make it less shitty, I might rework the auto-parry script I made. If not, maybe someone else will make a working one). Anyways, thank you all! If you want to check out my main script for the game I will link it below this everything on it should still work other than the documents use this script for the documents! ⬇️Main Script⬇️ https://rscripts.net/script/auto-fishauto-sleepauto-eat-and-more-Z6OB THANK YOU ALL!
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. 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 BloxScripts Risk Notice ]]
--=====================================================================
-- SHOGUN'S REIGN :: AUTO DOC For Latest Update
--
-- RightShift = panel Delete = unload
--=====================================================================
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local VIM = game:GetService("VirtualInputManager")
local plr = Players.LocalPlayer
local LOGFILE = "shogun_doc_auto.txt"
local LOG_ON = false -- console
local LOG_FILE = false -- shogun_doc_auto.txt
local CFG = {
SEND_DELAY = 0,
MIN_GAP = 0.05,
DEFAULT_AUTH = true,
PRESS_GAP = 1.5,
ROLE_GAP = 5,
STALE_CLOSE = 12,
}
local COL = {
bg = Color3.fromRGB(8, 11, 18), panel = Color3.fromRGB(13, 17, 28),
line = Color3.fromRGB(38, 52, 82), blue = Color3.fromRGB(56, 132, 255),
cyan = Color3.fromRGB(110, 200, 255), text = Color3.fromRGB(228, 236, 250),
dim = Color3.fromRGB(118, 134, 164), good = Color3.fromRGB(88, 220, 148),
bad = Color3.fromRGB(240, 104, 116),
trackOff = Color3.fromRGB(26, 34, 52), trackOn = Color3.fromRGB(24, 52, 100),
}
local GRANT, DENY, REFER = "Grant", "Deny", "Refer"
local function raw(...)
local p = {}
for i = 1, select("#", ...) do p[#p + 1] = tostring(select(i, ...)) end
return table.concat(p, " ")
end
local function log(...)
if not LOG_ON and not LOG_FILE then return end
local line = raw(...)
if LOG_ON then print(line) end
if LOG_FILE and appendfile then pcall(appendfile, LOGFILE, line .. "\n") end
end
--=====================================================================
-- 1) DocumentsData
--=====================================================================
local DD = nil
local ASK2AUTH = {}
local function normalizeAsk(s)
return (tostring(s):lower():gsub("[^%a]", ""))
end
local function findTemplates()
ASK2AUTH = {}
if not DD then return end
local best
for _, v in pairs(DD) do
if type(v) == "table" and type(v[1]) == "table"
and (type(v[1].ask) == "string" or type(v[1].body) == "string") then
best = v; break
end
end
if not best then return end
for _, t in ipairs(best) do
if type(t) == "table" and type(t.ask) == "string" then
ASK2AUTH[normalizeAsk(t.ask)] = (t.authority == true)
end
end
end
local function loadData()
local mod
for _, d in ipairs(ReplicatedStorage:GetDescendants()) do
if d:IsA("ModuleScript") and d.Name == "DocumentsData" then mod = d; break end
end
if not mod then return end
local ok, res = pcall(require, mod)
if not ok or type(res) ~= "table" then return end
DD = res
if type(DD.GRANT) == "string" then GRANT = DD.GRANT end
if type(DD.DENY) == "string" then DENY = DD.DENY end
if type(DD.REFER) == "string" then REFER = DD.REFER end
findTemplates()
end
local function authorityFor(ask): boolean
if type(ask) ~= "string" then return CFG.DEFAULT_AUTH end
local a = ASK2AUTH[normalizeAsk(ask)]
if a == nil then return CFG.DEFAULT_AUTH end
return a
end
local function rulingFor(marks, authority): string
local anyFalse = false
for _, m in ipairs(marks) do if m == false then anyFalse = true end end
if DD and type(DD.correctRuling) == "function" then
local ok, r = pcall(DD.correctRuling, not anyFalse, authority == true)
if ok and type(r) == "string" then return r end
end
if anyFalse then return DENY end
return authority and GRANT or REFER
end
--=====================================================================
-- 2) CLAIM VERIFICATION
--=====================================================================
local function parseRecords(records)
local map, districts = {}, {}
local last = nil
for _, r in ipairs(records) do
if type(r) == "table" then
local label = tostring(r[1] or "")
local val = tostring(r[2] or "")
map[label:lower()] = val
local head = label:match("^head:%s*(.+)$")
local houses = tonumber(val:match("^(%d+)%s+houses"))
if head then
if last then
districts[last].head = head
if houses then districts[last].houses = houses end
end
else
local tax = tonumber(val:match("(%d+)%s*Ryo"))
if tax then
districts[label] = { glyph = val:match("^(%S+)"), tax = tax }
last = label
elseif houses and last then
districts[last].houses = houses
end
end
end
end
return map, districts
end
local function verifyClaim(claim, map, districts, body, sealGlyph): boolean
local dist, amount = claim:match("^(.-)%s+paid%s+(%d+)%s*Ryo%s+in%s+tax")
if dist and amount then
local d = districts[dist]
return d ~= nil and d.tax == tonumber(amount)
end
local sealDist = claim:match("^This seal belongs to%s+(.-)%.?$")
if sealDist then
local d = districts[sealDist]
return d ~= nil and d.glyph == sealGlyph
end
local head, hdist = claim:match("^(.-)%s+is%s+the%s+head%s+of%s+(.-)%.?$")
if head and hdist then
local d = districts[hdist]
return d ~= nil and d.head == head
end
local day = claim:match("signed%s+on%s+day%s+(%-?%d+)")
if day then return map["signed on"] == ("day " .. day) end
if claim:match("%s+has%s+not%s+written%s+in") then
return map["times they wrote before"] == "none"
end
local _, wtimes = claim:match("^(.-)%s+has%s+written%s+in%s+(%d+)%s+times")
if wtimes then return map["times they wrote before"] == wtimes end
local _, wword = claim:match("^(.-)%s+has%s+written%s+in%s+(%a+)%s+this%s+season")
if wword then
local words = { once = "1", twice = "2", thrice = "3" }
return map["times they wrote before"] == (words[wword:lower()] or wword)
end
local hdist2, houses = claim:match("^(.-)%s+has%s+(%d+)%s+houses")
if hdist2 then
local d = districts[hdist2]
return d ~= nil and d.houses == tonumber(houses)
end
local n, unit = claim:match("(%d+)%s+([%a]+)")
if n and unit then
return body:lower():find(n .. " " .. unit:lower(), 1, true) ~= nil
end
return true
end
local function marksFromCase(case): (any, string)
local claims, records = case.claims, case.records
if type(claims) ~= "table" or #claims < 3 or type(records) ~= "table" then
return nil, "no-claims"
end
local map, districts = parseRecords(records)
local body = tostring(case.body or "")
local sealGlyph = tostring(case.sealGlyph or "")
local marks = {}
for i = 1, 3 do
marks[i] = verifyClaim(tostring(claims[i]), map, districts, body, sealGlyph)
end
return marks, "claim-verify"
end
local function deepWalk(v, depth, fn, seen)
depth = depth or 0
if depth > 6 or type(v) ~= "table" then return end
seen = seen or {}
if seen[v] then return end
seen[v] = true
fn(v)
for _, s in pairs(v) do deepWalk(s, depth + 1, fn, seen) end
end
local function findCaseTable(arr)
local found
deepWalk(arr, 0, function(t)
if found then return end
if type(t.claims) == "table" and type(t.records) == "table" and type(t.body) == "string" then
found = t
end
end)
return found
end
--=====================================================================
-- 3) STATE
--=====================================================================
local ST = {
autoAnswer = true, autoDocs = true, teleport = true, verbose = false,
events = 0, cases = 0, sent = 0, lastSend = 0, lastCase = 0,
lastPress = 0, lastRole = 0, docOpen = false, docCaseAt = 0,
lastMarks = nil, lastRuling = nil, match = 0, miss = 0, barred = 0,
reward = 0, fastest = 999,
}
--=====================================================================
-- 4) WORLD / DOCS AUTOMATION
--=====================================================================
local docsRemote: RemoteEvent? = nil
local function alive(): boolean
local ch = plr.Character
local hum = ch and ch:FindFirstChildOfClass("Humanoid")
return hum ~= nil and hum.Health > 0
end
local function findRemoteByName(name): Instance?
local events = ReplicatedStorage:FindFirstChild("Events")
if not events then return nil end
for _, d in ipairs(events:GetDescendants()) do
if d:IsA("RemoteEvent") and d.Name == name then return d end
end
return nil
end
local function changeRole(team, subrole, display): boolean
if not team or team == "" then return false end
local p = findRemoteByName("ProgressionRemote")
if not p then return false end
pcall(function() p:FireServer("ChangeRole", team, subrole or "", display or "") end)
return true
end
local function getDocsFolder(): Instance?
local w = workspace:FindFirstChild("World")
local inter = w and w:FindFirstChild("Interactables")
return inter and inter:FindFirstChild("Documents")
end
local function docsPanel(): Instance?
local pg = plr:FindFirstChild("PlayerGui")
local main = pg and pg:FindFirstChild("MainUI")
return main and main:FindFirstChild("Documents")
end
local function hideGuide()
local d = docsPanel()
local g = d and d:FindFirstChild("Guide")
if g and g:IsA("GuiObject") and g.Visible then g.Visible = false end
end
local function readGuide()
hideGuide()
if docsRemote then pcall(function() docsRemote:FireServer("GuideRead") end) end
end
local function docsPos()
local folder = getDocsFolder()
local ch = plr.Character
local hrp = ch and ch:FindFirstChild("HumanoidRootPart")
if not folder or not hrp then return nil end
local best, bestD
for _, obj in ipairs(folder:GetDescendants()) do
if obj:IsA("BasePart") then
local d = (obj.Position - hrp.Position).Magnitude
if not bestD or d < bestD then best, bestD = obj, d end
end
end
return best and best.Position or nil
end
local function tpSnap(pos): boolean
local ch = plr.Character
if not ch or not pos then return false end
local rp = RaycastParams.new()
rp.FilterDescendantsInstances = { ch }
rp.IgnoreWater = false
local res = workspace:Raycast(Vector3.new(pos.X, pos.Y + 5, pos.Z), Vector3.new(0, -50, 0), rp)
local land = res and (res.Position + Vector3.new(0, 3, 0)) or (pos + Vector3.new(0, 3, 0))
ch:PivotTo(CFrame.new(land))
return true
end
local function docsPrompt(): ProximityPrompt?
local folder = getDocsFolder()
if not folder then return nil end
local ch = plr.Character
local hrp = ch and ch:FindFirstChild("HumanoidRootPart")
if not hrp then return nil end
for _, obj in ipairs(folder:GetDescendants()) do
if obj:IsA("ProximityPrompt") and obj.Enabled then
if obj.ActionText == "Check documents" or obj.ObjectText == "Documents" then
local parentPart = obj:FindFirstAncestorWhichIsA("BasePart")
if parentPart and (parentPart.Position - hrp.Position).Magnitude <= 14 then
return obj
end
end
end
end
for _, obj in ipairs(folder:GetDescendants()) do
if obj:IsA("ProximityPrompt") and obj.Enabled then
local parentPart = obj:FindFirstAncestorWhichIsA("BasePart")
if parentPart and (parentPart.Position - hrp.Position).Magnitude <= 12 then
return obj
end
end
end
return nil
end
local function triggerPrompt(pr)
if not pr then return end
if type(fireproximityprompt) == "function" then
if pcall(fireproximityprompt, pr) then
task.wait(0.3)
return
end
end
pcall(function()
pr:InputHoldBegin()
task.wait(math.max(pr.HoldDuration or 0, 0.15) + 0.05)
pr:InputHoldEnd()
end)
task.wait(0.2)
pcall(function()
VIM:SendKeyEvent(true, Enum.KeyCode.E, false, game)
task.wait(0.1)
VIM:SendKeyEvent(false, Enum.KeyCode.E, false, game)
end)
end
local function docTick()
if not ST.autoDocs or not alive() then return end
if not ST.docOpen and tick() - ST.lastPress > CFG.PRESS_GAP then
if (plr.Team and plr.Team.Name) ~= "Feudal Noble" then
if tick() - ST.lastRole > CFG.ROLE_GAP then
ST.lastRole = tick()
changeRole("Feudal Noble", "", "")
task.wait(1.5)
end
return
end
hideGuide()
local pr = docsPrompt()
if not pr then
local pos = docsPos()
if pos then
tpSnap(pos)
task.wait(0.35)
pr = docsPrompt()
end
end
if pr then
ST.lastPress = tick()
triggerPrompt(pr)
ST.docOpen = true
ST.docCaseAt = tick()
end
end
if ST.docOpen and tick() - ST.docCaseAt > CFG.STALE_CLOSE then
ST.docOpen = false
if docsRemote then pcall(function() docsRemote:FireServer("Close") end) end
end
end
--=====================================================================
-- 5) REMOTE
--=====================================================================
local conns = {}
local function findRemote(): RemoteEvent?
local ev = ReplicatedStorage:FindFirstChild("Events")
ev = ev and ev:FindFirstChild("Activities")
ev = ev and ev:FindFirstChild("Documents")
if ev and ev:IsA("RemoteEvent") then return ev end
for _, d in ipairs(ReplicatedStorage:GetDescendants()) do
if d:IsA("RemoteEvent") and d.Name == "Documents" then return d end
end
return nil
end
local function send(...)
if not docsRemote then return end
local a = table.pack(...)
local ok = pcall(function() docsRemote:FireServer(table.unpack(a, 1, a.n)) end)
if not ok then log("[SEND] FAILED") end
end
local function handleVerdict(v)
if type(v) ~= "table" then return end
ST.docCaseAt = tick()
local t = v.truths
if type(v.reward) == "number" then ST.reward += v.reward end
if t and ST.lastMarks then
local same = ST.lastMarks[1] == t[1] and ST.lastMarks[2] == t[2] and ST.lastMarks[3] == t[3]
if same then ST.match += 1 else ST.miss += 1 end
log(("[verdict] %s | our %s vs correct %s | reward %s"):format(
same and "MATCH" or "DIFFER", tostring(ST.lastRuling),
tostring(v.ruling), tostring(v.reward)))
end
if v.barred then ST.barred += 1 end
end
local function handlePayload(...)
local t0 = os.clock()
local args = table.pack(...)
ST.events += 1
local arr = {}
for i = 1, args.n do arr[i] = args[i] end
local head = tostring(arr[1] or "")
if head == "Verdict" then handleVerdict(arr[2]); return end
if head == "Guide" then readGuide(); return end
if head ~= "Case" then return end
ST.docCaseAt = tick()
ST.docOpen = true
local case = findCaseTable(arr)
if not case then return end
local marks = marksFromCase(case)
if not marks then marks = { true, true, true } end
local authority = authorityFor(tostring(case.ask or ""))
local ruling = rulingFor(marks, authority)
local now = os.clock()
if ST.autoAnswer and (now - ST.lastSend) >= CFG.MIN_GAP then
ST.lastSend = now
if CFG.SEND_DELAY > 0 then
task.delay(CFG.SEND_DELAY, function() send("Rule", marks, ruling) end)
else
send("Rule", marks, ruling)
end
ST.sent += 1
end
local ms = (os.clock() - t0) * 1000
if ms < ST.fastest then ST.fastest = ms end
ST.lastMarks, ST.lastRuling, ST.lastCase = marks, ruling, os.clock()
ST.cases += 1
log(("[case #%s] %.2fms marks={%s,%s,%s} -> %s"):format(
tostring(arr[2]), ms, tostring(marks[1]), tostring(marks[2]),
tostring(marks[3]), tostring(ruling)))
end
local function connect()
if not docsRemote then return end
for _, c in ipairs(conns) do pcall(function() c:Disconnect() end) end
conns = {}
conns[#conns + 1] = docsRemote.OnClientEvent:Connect(function(...)
local ok, err = pcall(handlePayload, ...)
if not ok then log("[handler] " .. tostring(err)) end
end)
end
--=====================================================================
-- 6) GUI
--=====================================================================
local W, H = 430, 336
local UI = {}
local function makeGui()
local sg = Instance.new("ScreenGui")
sg.Name = "ShogunDocs"
sg.ResetOnSpawn = false
sg.IgnoreGuiInset = true
sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
sg.DisplayOrder = 60
sg.Parent = plr:WaitForChild("PlayerGui")
local root = Instance.new("Frame")
root.AnchorPoint = Vector2.new(0.5, 0.5)
root.Position = UDim2.new(0.5, 0, 0.5, 0)
root.Size = UDim2.new(0, 0, 0, H)
root.BackgroundTransparency = 1
root.ClipsDescendants = true
root.Visible = false
root.ZIndex = 0
root.Parent = sg
local panel = Instance.new("CanvasGroup")
panel.Size = UDim2.new(0, W, 0, H)
panel.BackgroundColor3 = COL.panel
panel.BorderSizePixel = 0
panel.ZIndex = 1
panel.Parent = root
local pc = Instance.new("UICorner"); pc.CornerRadius = UDim.new(0, 12); pc.Parent = panel
local ps = Instance.new("UIStroke"); ps.Thickness = 1.4; ps.Color = COL.blue
ps.Transparency = 0.25; ps.Parent = panel
local pg = Instance.new("UIGradient")
pg.Color = ColorSequence.new(COL.cyan, COL.blue)
pg.Rotation = 45; pg.Transparency = NumberSequence.new(0.15, 0.6); pg.Parent = ps
local head = Instance.new("Frame")
head.Size = UDim2.new(1, 0, 0, 54); head.BackgroundTransparency = 1
head.ZIndex = 2; head.Parent = panel
local title = Instance.new("TextLabel")
title.BackgroundTransparency = 1
title.Position = UDim2.new(0, 16, 0, 12)
title.Size = UDim2.new(1, -32, 0, 20)
title.Font = Enum.Font.GothamBold; title.TextSize = 15
title.TextXAlignment = Enum.TextXAlignment.Left
title.TextColor3 = COL.text
title.Text = "SHOGUN'S REIGN AUTO DOCS V.1"
title.ZIndex = 3; title.Parent = head
local credit = Instance.new("TextLabel")
credit.BackgroundTransparency = 1
credit.Position = UDim2.new(0, 16, 0, 31)
credit.Size = UDim2.new(1, -32, 0, 14)
credit.Font = Enum.Font.Gotham; credit.TextSize = 10
credit.TextXAlignment = Enum.TextXAlignment.Left
credit.TextColor3 = COL.dim
credit.Text = "Made by SoullessTony"
credit.ZIndex = 3; credit.Parent = head
local dot = Instance.new("Frame")
dot.AnchorPoint = Vector2.new(1, 0.5)
dot.Position = UDim2.new(1, -16, 0, 27)
dot.Size = UDim2.new(0, 8, 0, 8)
dot.BackgroundColor3 = COL.dim
dot.ZIndex = 3; dot.Parent = head
local dc = Instance.new("UICorner"); dc.CornerRadius = UDim.new(1, 0); dc.Parent = dot
UI.dot = dot
local sep = Instance.new("Frame")
sep.Position = UDim2.new(0, 12, 0, 54)
sep.Size = UDim2.new(1, -24, 0, 1)
sep.BackgroundColor3 = COL.line; sep.BorderSizePixel = 0
sep.ZIndex = 2; sep.Parent = panel
local tabs = Instance.new("Frame")
tabs.Position = UDim2.new(0, 12, 0, 62)
tabs.Size = UDim2.new(1, -24, 0, 24)
tabs.BackgroundTransparency = 1
tabs.ZIndex = 2; tabs.Parent = panel
local tl = Instance.new("UIListLayout")
tl.FillDirection = Enum.FillDirection.Horizontal
tl.Padding = UDim.new(0, 6); tl.Parent = tabs
local pages = Instance.new("Frame")
pages.Position = UDim2.new(0, 14, 0, 94)
pages.Size = UDim2.new(1, -28, 1, -140)
pages.BackgroundTransparency = 1
pages.ZIndex = 2; pages.Parent = panel
local pageCfg = Instance.new("Frame")
pageCfg.Size = UDim2.new(1, 0, 1, 0); pageCfg.BackgroundTransparency = 1
pageCfg.ZIndex = 2; pageCfg.Parent = pages
local pageStat = Instance.new("Frame")
pageStat.Size = UDim2.new(1, 0, 1, 0); pageStat.BackgroundTransparency = 1
pageStat.Visible = false; pageStat.ZIndex = 2; pageStat.Parent = pages
local cfgList = Instance.new("UIListLayout")
cfgList.Padding = UDim.new(0, 4); cfgList.Parent = pageCfg
local statList = Instance.new("UIListLayout")
statList.Padding = UDim.new(0, 3); statList.Parent = pageStat
local tabButtons = {}
local function makeTab(label, page)
local b = Instance.new("TextButton")
b.Size = UDim2.new(0, 92, 0, 24)
b.BackgroundColor3 = COL.bg
b.Text = label
b.Font = Enum.Font.GothamMedium; b.TextSize = 11
b.TextColor3 = COL.dim; b.AutoButtonColor = false
b.ZIndex = 3; b.Parent = tabs
local c = Instance.new("UICorner"); c.CornerRadius = UDim.new(0, 7); c.Parent = b
local s = Instance.new("UIStroke"); s.Color = COL.line; s.Thickness = 1; s.Parent = b
local function render(active)
TweenService:Create(b, TweenInfo.new(0.15), {
BackgroundColor3 = active and COL.trackOn or COL.bg,
TextColor3 = active and COL.text or COL.dim }):Play()
s.Color = active and COL.blue or COL.line
end
b.MouseButton1Click:Connect(function()
pageCfg.Visible = (page == pageCfg)
pageStat.Visible = (page == pageStat)
for other, r in pairs(tabButtons) do r(other == b) end
end)
tabButtons[b] = render
return b
end
makeTab("CONFIG", pageCfg)
makeTab("STATUS", pageStat)
for b, r in pairs(tabButtons) do r(b.Text == "CONFIG") end
local function makeToggle(parent, order, label, get, set)
local row = Instance.new("Frame")
row.Size = UDim2.new(1, 0, 0, 26); row.BackgroundTransparency = 1
row.LayoutOrder = order; row.ZIndex = 3; row.Parent = parent
local txt = Instance.new("TextLabel")
txt.BackgroundTransparency = 1
txt.Size = UDim2.new(1, -54, 1, 0)
txt.Font = Enum.Font.GothamMedium; txt.TextSize = 12
txt.TextColor3 = COL.dim; txt.TextXAlignment = Enum.TextXAlignment.Left
txt.Text = label; txt.ZIndex = 4; txt.Parent = row
local track = Instance.new("Frame")
track.AnchorPoint = Vector2.new(1, 0.5)
track.Position = UDim2.new(1, 0, 0.5, 0)
track.Size = UDim2.new(0, 38, 0, 18)
track.BackgroundColor3 = COL.trackOff
track.ZIndex = 4; track.Parent = row
local tc = Instance.new("UICorner"); tc.CornerRadius = UDim.new(1, 0); tc.Parent = track
local ts = Instance.new("UIStroke"); ts.Color = COL.line; ts.Thickness = 1; ts.Parent = track
local knob = Instance.new("Frame")
knob.AnchorPoint = Vector2.new(0, 0.5)
knob.Position = UDim2.new(0, 2, 0.5, 0)
knob.Size = UDim2.new(0, 14, 0, 14)
knob.BackgroundColor3 = COL.dim
knob.ZIndex = 5; knob.Parent = track
local kc = Instance.new("UICorner"); kc.CornerRadius = UDim.new(1, 0); kc.Parent = knob
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, 0, 1, 0); btn.BackgroundTransparency = 1
btn.Text = ""; btn.ZIndex = 6; btn.Parent = row
local function render()
local on = get()
TweenService:Create(knob, TweenInfo.new(0.16, Enum.EasingStyle.Quint), {
Position = on and UDim2.new(1, -16, 0.5, 0) or UDim2.new(0, 2, 0.5, 0),
BackgroundColor3 = on and COL.blue or COL.dim }):Play()
TweenService:Create(track, TweenInfo.new(0.16), {
BackgroundColor3 = on and COL.trackOn or COL.trackOff }):Play()
ts.Color = on and COL.blue or COL.line
txt.TextColor3 = on and COL.text or COL.dim
end
btn.MouseButton1Click:Connect(function() set(not get()); render() end)
render()
return render
end
makeToggle(pageCfg, 1, "Auto Docs (walk + E)", function() return ST.autoDocs end,
function(v) ST.autoDocs = v end)
makeToggle(pageCfg, 2, "Auto Answer", function() return ST.autoAnswer end,
function(v) ST.autoAnswer = v end)
makeToggle(pageCfg, 3, "Teleport to table", function() return ST.teleport end,
function(v) ST.teleport = v end)
makeToggle(pageCfg, 4, "Logs (console + file)", function() return ST.verbose end,
function(v)
ST.verbose = v
LOG_ON, LOG_FILE = v, v
if v and writefile then pcall(writefile, LOGFILE, "-- shogun doc auto --\n") end
end)
local btnRow = Instance.new("Frame")
btnRow.Size = UDim2.new(1, 0, 0, 30); btnRow.BackgroundTransparency = 1
btnRow.LayoutOrder = 6; btnRow.ZIndex = 3; btnRow.Parent = pageCfg
local brl = Instance.new("UIListLayout")
brl.FillDirection = Enum.FillDirection.Horizontal
brl.Padding = UDim.new(0, 6); brl.Parent = btnRow
local function makeButton(parent, label, width, fn, accent)
local b = Instance.new("TextButton")
b.Size = UDim2.new(0, width, 1, 0)
b.BackgroundColor3 = accent and COL.trackOn or COL.bg
b.Text = label
b.Font = Enum.Font.GothamBold; b.TextSize = 11
b.TextColor3 = accent and COL.text or COL.dim
b.AutoButtonColor = false
b.ZIndex = 4; b.Parent = parent
local c = Instance.new("UICorner"); c.CornerRadius = UDim.new(0, 8); c.Parent = b
local s = Instance.new("UIStroke"); s.Color = accent and COL.blue or COL.line
s.Thickness = 1; s.Parent = b
b.MouseButton1Click:Connect(function()
TweenService:Create(b, TweenInfo.new(0.1), { BackgroundColor3 = COL.blue }):Play()
task.delay(0.12, function()
TweenService:Create(b, TweenInfo.new(0.2), {
BackgroundColor3 = accent and COL.trackOn or COL.bg }):Play()
end)
fn()
end)
return b
end
makeButton(btnRow, "GO TO DOCS", 108, function()
local pos = docsPos()
if pos then tpSnap(pos) end
end, true)
makeButton(btnRow, "OPEN DOCS", 92, function()
local pr = docsPrompt()
if not pr then
local pos = docsPos()
if pos then tpSnap(pos); task.wait(0.4); pr = docsPrompt() end
end
if pr then triggerPrompt(pr) end
end)
makeButton(btnRow, "FEUDAL", 92, function()
changeRole("Feudal Noble", "", "")
end)
local statRows = {}
local function makeStat(order, label)
local row = Instance.new("Frame")
row.Size = UDim2.new(1, 0, 0, 18); row.BackgroundTransparency = 1
row.LayoutOrder = order; row.ZIndex = 3; row.Parent = pageStat
local l = Instance.new("TextLabel")
l.BackgroundTransparency = 1; l.Size = UDim2.new(0.6, 0, 1, 0)
l.Font = Enum.Font.Gotham; l.TextSize = 11; l.TextColor3 = COL.dim
l.TextXAlignment = Enum.TextXAlignment.Left; l.Text = label
l.ZIndex = 4; l.Parent = row
local v = Instance.new("TextLabel")
v.BackgroundTransparency = 1
v.Position = UDim2.new(0.6, 0, 0, 0); v.Size = UDim2.new(0.4, 0, 1, 0)
v.Font = Enum.Font.GothamBold; v.TextSize = 11; v.TextColor3 = COL.text
v.TextXAlignment = Enum.TextXAlignment.Right; v.Text = "-"
v.ZIndex = 4; v.Parent = row
statRows[label] = v
end
makeStat(1, "cases"); makeStat(2, "claims match"); makeStat(3, "claims miss")
makeStat(4, "sent"); makeStat(5, "reward"); makeStat(6, "fastest ms")
makeStat(7, "barred"); makeStat(8, "team"); makeStat(9, "templates")
UI.statRows = statRows
local foot = Instance.new("TextLabel")
foot.AnchorPoint = Vector2.new(0.5, 1)
foot.Position = UDim2.new(0.5, 0, 1, -10)
foot.Size = UDim2.new(1, -28, 0, 14)
foot.BackgroundTransparency = 1
foot.Font = Enum.Font.Gotham; foot.TextSize = 10
foot.TextColor3 = COL.dim
foot.Text = "RightShift toggle Delete unload"
foot.ZIndex = 3; foot.Parent = panel
local isOpen = false
local function setOpen(v)
if isOpen == v then return end
isOpen = v
if v then
root.Visible = true
root.Size = UDim2.new(0, 0, 0, H)
panel.GroupTransparency = 1
TweenService:Create(root, TweenInfo.new(0.34, Enum.EasingStyle.Quint, Enum.EasingDirection.Out),
{ Size = UDim2.new(0, W, 0, H) }):Play()
TweenService:Create(panel, TweenInfo.new(0.3), { GroupTransparency = 0 }):Play()
else
TweenService:Create(root, TweenInfo.new(0.28, Enum.EasingStyle.Quint, Enum.EasingDirection.In),
{ Size = UDim2.new(0, 0, 0, H) }):Play()
TweenService:Create(panel, TweenInfo.new(0.2), { GroupTransparency = 1 }):Play()
task.delay(0.3, function() if not isOpen then root.Visible = false end end)
end
end
UI.root = root
UI.setOpen = setOpen
UI.isOpen = function() return isOpen end
task.spawn(function()
while true do
task.wait(0.4)
local r = UI.statRows
if r then
r["cases"].Text = tostring(ST.cases)
r["claims match"].Text = tostring(ST.match)
r["claims miss"].Text = tostring(ST.miss)
r["claims miss"].TextColor3 = ST.miss > 0 and COL.bad or COL.text
r["sent"].Text = tostring(ST.sent)
r["reward"].Text = tostring(ST.reward)
r["reward"].TextColor3 = ST.reward >= 0 and COL.good or COL.bad
r["fastest ms"].Text = ST.fastest < 999 and string.format("%.2f", ST.fastest) or "-"
r["barred"].Text = tostring(ST.barred)
r["team"].Text = (plr.Team and plr.Team.Name) or "-"
local n = 0
for _ in pairs(ASK2AUTH) do n += 1 end
r["templates"].Text = tostring(n)
end
if UI.dot then
UI.dot.BackgroundColor3 = (os.clock() - ST.lastCase) < 1.2 and COL.cyan or COL.dim
end
end
end)
end
--=====================================================================
-- 7) BOOT
--=====================================================================
local binds = {}
local function unload()
for _, c in ipairs(conns) do pcall(function() c:Disconnect() end) end
for _, b in ipairs(binds) do pcall(function() b:Disconnect() end) end
if UI.root and UI.root.Parent then pcall(function() UI.root.Parent:Destroy() end) end
log("[auto] unloaded")
end
local function bind(key, fn)
binds[#binds + 1] = UserInputService.InputBegan:Connect(function(input)
if input.KeyCode == key then fn() end
end)
end
local function boot()
makeGui()
loadData()
bind(Enum.KeyCode.RightShift, function() UI.setOpen(not UI.isOpen()) end)
bind(Enum.KeyCode.Delete, unload)
task.spawn(function()
while not docsRemote do
docsRemote = findRemote()
if docsRemote then connect() else task.wait(1) end
end
end)
task.spawn(function()
while true do
task.wait(0.5)
pcall(docTick)
end
end)
UI.setOpen(true)
end
boot()Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.


Your community, in one place