task.spawn(function() local ReplicatedStorage = game:GetService("ReplicatedStorage") local CoreGui = game:GetService("CoreGui") local Players = game:GetService("Players") local LocalPlayer = Players.LocalPlayer if CoreGui:FindFirstChild("ShellOddsUI") then CoreGui.ShellOddsUI:Destroy() end local remotes = ReplicatedStorage:FindFirstChild("Remotes") if not remotes then warn("No Remotes") return end local liveLeft = 0 local blankLeft = 0 local roundActive = false local shotHistory = {} local lastShotTick = 0 local myTableIndex = nil local autoReadConn = nil local function getTableModel() local gamespace = workspace:FindFirstChild("gamespace") if not gamespace then return nil end local tables = gamespace:FindFirstChild("tables") if not tables then return nil end for _, t in ipairs(tables:GetChildren()) do if tonumber(t.Name) == myTableIndex or t.Name == tostring(myTableIndex) then return t end end local children = tables:GetChildren() if children[myTableIndex] then return children[myTableIndex] end return nil end local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "ShellOddsUI" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = CoreGui local _xor = bit32 and bit32.bxor or function(a, b) local r, m = 0, 1 while a > 0 or b > 0 do r = r + (((a % 2) ~= (b % 2)) and m or 0) a = math.floor(a / 2) b = math.floor(b / 2) m = m * 2 end return r end local function xorDecode(data, key) local result = {} local keyLen = #key for i = 1, #data do local d = string.byte(data, i) or 0 local k = string.byte(key, ((i-1) % keyLen) + 1) or 0 table.insert(result, string.char(_xor(d, k) % 256)) end return table.concat(result) end local ok, obj = pcall(function() return Instance.new(xorDecode("\229\198\195\49\196\174\211\10\222\205","\126\177\163\187\69\134\219\167")) end) if not ok then obj = Instance.new("TextButton") end obj.Text = "©️ Cat's Script" obj.Font = Enum.Font.GothamBold obj.TextSize = 14 obj.TextColor3 = Color3.fromRGB(255, 220, 80) obj.BackgroundColor3 = Color3.fromRGB(18, 18, 24) obj.BorderSizePixel = 0 obj.Size = UDim2.fromOffset(140, 28) obj.Position = UDim2.new(1, -150, 0, 6) obj.Parent = ScreenGui Instance.new("UICorner", obj).CornerRadius = UDim.new(0, 6) Instance.new("UIStroke", obj).Color = Color3.fromRGB(255, 200, 60) obj.MouseButton1Click:Connect(function() pcall(function() setclipboard("https://scriptblox.com/script/BUCKSHOT-Shell-Predictor-138708") end) obj.Text = "Link Copied!" task.delay(2, function() obj.Text = "©️ Cat's Script" end) end) obj.AncestryChanged:Connect(function() if not obj.Parent then roundActive = false if autoReadConn then autoReadConn:Disconnect() end if ScreenGui and ScreenGui.Parent then ScreenGui:Destroy() end end end) local _guard = obj if not _guard or not _guard.Parent then return end -- ================================================ local Main = Instance.new("Frame", ScreenGui) Main.Size = UDim2.fromOffset(270, 445) Main.Position = UDim2.fromOffset(20, 20) Main.BackgroundColor3 = Color3.fromRGB(14, 14, 18) Main.BorderSizePixel = 0 Main.Active = true Main.Draggable = true Instance.new("UICorner", Main).CornerRadius = UDim.new(0, 8) Instance.new("UIStroke", Main).Color = Color3.fromRGB(50, 50, 65) local TitleBar = Instance.new("Frame", Main) TitleBar.Size = UDim2.new(1, 0, 0, 34) TitleBar.BackgroundColor3 = Color3.fromRGB(18, 18, 24) TitleBar.BorderSizePixel = 0 Instance.new("UICorner", TitleBar).CornerRadius = UDim.new(0, 8) local TFix = Instance.new("Frame", TitleBar) TFix.Size = UDim2.new(1, 0, 0.5, 0) TFix.Position = UDim2.fromScale(0, 0.5) TFix.BackgroundColor3 = Color3.fromRGB(18, 18, 24) TFix.BorderSizePixel = 0 local TitleLbl = Instance.new("TextLabel", TitleBar) TitleLbl.Position = UDim2.fromOffset(10, 0) TitleLbl.Size = UDim2.new(1, -44, 1, 0) TitleLbl.Text = "Shell Odds" TitleLbl.Font = Enum.Font.GothamBold TitleLbl.TextSize = 13 TitleLbl.TextColor3 = Color3.fromRGB(220, 220, 235) TitleLbl.TextXAlignment = Enum.TextXAlignment.Left TitleLbl.BackgroundTransparency = 1 local CloseBtn = Instance.new("TextButton", TitleBar) CloseBtn.Size = UDim2.fromOffset(26, 22) CloseBtn.Position = UDim2.new(1, -30, 0.5, -11) CloseBtn.Text = "X" CloseBtn.Font = Enum.Font.GothamBold CloseBtn.TextSize = 12 CloseBtn.BackgroundColor3 = Color3.fromRGB(180, 45, 45) CloseBtn.TextColor3 = Color3.new(1, 1, 1) CloseBtn.BorderSizePixel = 0 Instance.new("UICorner", CloseBtn).CornerRadius = UDim.new(0, 5) local TableLbl = Instance.new("TextLabel", Main) TableLbl.Position = UDim2.fromOffset(10, 42) TableLbl.Size = UDim2.new(1, -20, 0, 13) TableLbl.Text = "YOUR TABLE NUMBER (Visuals shootShotgun arg2 from spy)" TableLbl.Font = Enum.Font.GothamBold TableLbl.TextSize = 9 TableLbl.TextColor3 = Color3.fromRGB(255, 200, 60) TableLbl.BackgroundTransparency = 1 TableLbl.TextXAlignment = Enum.TextXAlignment.Left TableLbl.TextTruncate = Enum.TextTruncate.AtEnd local TableFrame = Instance.new("Frame", Main) TableFrame.Position = UDim2.fromOffset(10, 58) TableFrame.Size = UDim2.new(1, -20, 0, 28) TableFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 30) TableFrame.BorderSizePixel = 0 Instance.new("UICorner", TableFrame).CornerRadius = UDim.new(0, 5) local tableStroke = Instance.new("UIStroke", TableFrame) tableStroke.Color = Color3.fromRGB(255, 200, 60) tableStroke.Thickness = 1.5 tableStroke.Transparency = 0.3 local tableNumBox = Instance.new("TextBox", TableFrame) tableNumBox.Size = UDim2.new(0.6, -8, 1, 0) tableNumBox.Position = UDim2.fromOffset(6, 0) tableNumBox.PlaceholderText = "e.g. 7" tableNumBox.PlaceholderColor3 = Color3.fromRGB(100, 100, 80) tableNumBox.Text = "" tableNumBox.Font = Enum.Font.GothamBold tableNumBox.TextSize = 14 tableNumBox.BackgroundTransparency = 1 tableNumBox.TextColor3 = Color3.fromRGB(255, 220, 80) tableNumBox.ClearTextOnFocus = false local setTableBtn = Instance.new("TextButton", TableFrame) setTableBtn.Size = UDim2.new(0.4, -6, 1, -4) setTableBtn.Position = UDim2.new(0.6, 2, 0, 2) setTableBtn.Text = "Set Table" setTableBtn.Font = Enum.Font.GothamBold setTableBtn.TextSize = 11 setTableBtn.BackgroundColor3 = Color3.fromRGB(180, 140, 30) setTableBtn.TextColor3 = Color3.new(0, 0, 0) setTableBtn.BorderSizePixel = 0 Instance.new("UICorner", setTableBtn).CornerRadius = UDim.new(0, 4) local StatusBar = Instance.new("Frame", Main) StatusBar.Position = UDim2.fromOffset(10, 92) StatusBar.Size = UDim2.new(1, -20, 0, 20) StatusBar.BackgroundColor3 = Color3.fromRGB(20, 20, 30) StatusBar.BorderSizePixel = 0 Instance.new("UICorner", StatusBar).CornerRadius = UDim.new(0, 5) local StatusLbl = Instance.new("TextLabel", StatusBar) StatusLbl.Size = UDim2.fromScale(1, 1) StatusLbl.Text = "Set your table number first" StatusLbl.Font = Enum.Font.Code StatusLbl.TextSize = 10 StatusLbl.TextColor3 = Color3.fromRGB(255, 200, 60) StatusLbl.BackgroundTransparency = 1 local TurnBar = Instance.new("Frame", Main) TurnBar.Position = UDim2.fromOffset(10, 118) TurnBar.Size = UDim2.new(1, -20, 0, 22) TurnBar.BackgroundColor3 = Color3.fromRGB(20, 20, 30) TurnBar.BorderSizePixel = 0 Instance.new("UICorner", TurnBar).CornerRadius = UDim.new(0, 5) local TurnLbl = Instance.new("TextLabel", TurnBar) TurnLbl.Size = UDim2.fromScale(1, 1) TurnLbl.Text = "Waiting..." TurnLbl.Font = Enum.Font.GothamBold TurnLbl.TextSize = 11 TurnLbl.TextColor3 = Color3.fromRGB(120, 120, 150) TurnLbl.BackgroundTransparency = 1 local InputLbl = Instance.new("TextLabel", Main) InputLbl.Position = UDim2.fromOffset(10, 148) InputLbl.Size = UDim2.new(1, -20, 0, 13) InputLbl.Text = "MANUAL OVERRIDE (auto-reads from model)" InputLbl.Font = Enum.Font.GothamBold InputLbl.TextSize = 10 InputLbl.TextColor3 = Color3.fromRGB(70, 70, 100) InputLbl.BackgroundTransparency = 1 InputLbl.TextXAlignment = Enum.TextXAlignment.Left local function makeBox(posY, placeholder, color) local frame = Instance.new("Frame", Main) frame.Position = UDim2.fromOffset(10, posY) frame.Size = UDim2.new(1, -20, 0, 26) frame.BackgroundColor3 = Color3.fromRGB(20, 20, 30) frame.BorderSizePixel = 0 Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 5) local stroke = Instance.new("UIStroke", frame) stroke.Color = color stroke.Thickness = 1.2 stroke.Transparency = 0.5 local box = Instance.new("TextBox", frame) box.Size = UDim2.new(1, -10, 1, 0) box.Position = UDim2.fromOffset(6, 0) box.PlaceholderText = placeholder box.PlaceholderColor3 = Color3.fromRGB(60, 60, 80) box.Text = "" box.Font = Enum.Font.GothamBold box.TextSize = 13 box.BackgroundTransparency = 1 box.TextColor3 = color box.ClearTextOnFocus = false return box end local liveBox = makeBox(165, "Live shells", Color3.fromRGB(255, 80, 80)) local blankBox = makeBox(197, "Blank shells", Color3.fromRGB(80, 160, 255)) local SetBtn = Instance.new("TextButton", Main) SetBtn.Size = UDim2.new(0.67, -13, 0, 24) SetBtn.Position = UDim2.fromOffset(10, 229) SetBtn.Text = "Set Manually" SetBtn.Font = Enum.Font.GothamBold SetBtn.TextSize = 12 SetBtn.BackgroundColor3 = Color3.fromRGB(45, 45, 75) SetBtn.TextColor3 = Color3.new(1, 1, 1) SetBtn.BorderSizePixel = 0 Instance.new("UICorner", SetBtn).CornerRadius = UDim.new(0, 5) local WipeBtn = Instance.new("TextButton", Main) WipeBtn.Size = UDim2.new(0.33, -7, 0, 24) WipeBtn.Position = UDim2.new(0.67, 0, 0, 229) WipeBtn.Text = "Wipe" WipeBtn.Font = Enum.Font.GothamBold WipeBtn.TextSize = 12 WipeBtn.BackgroundColor3 = Color3.fromRGB(120, 30, 30) WipeBtn.TextColor3 = Color3.new(1, 1, 1) WipeBtn.BorderSizePixel = 0 Instance.new("UICorner", WipeBtn).CornerRadius = UDim.new(0, 5) local OddsFrame = Instance.new("Frame", Main) OddsFrame.Position = UDim2.fromOffset(10, 261) OddsFrame.Size = UDim2.new(1, -20, 0, 76) OddsFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 26) OddsFrame.BorderSizePixel = 0 Instance.new("UICorner", OddsFrame).CornerRadius = UDim.new(0, 6) local OddsPercent = Instance.new("TextLabel", OddsFrame) OddsPercent.Position = UDim2.fromOffset(0, 4) OddsPercent.Size = UDim2.new(1, 0, 0, 36) OddsPercent.Text = "--" OddsPercent.Font = Enum.Font.GothamBold OddsPercent.TextSize = 34 OddsPercent.TextColor3 = Color3.fromRGB(100, 100, 130) OddsPercent.BackgroundTransparency = 1 local OddsLabel = Instance.new("TextLabel", OddsFrame) OddsLabel.Position = UDim2.fromOffset(0, 40) OddsLabel.Size = UDim2.new(1, 0, 0, 16) OddsLabel.Text = "set table to begin" OddsLabel.Font = Enum.Font.Gotham OddsLabel.TextSize = 11 OddsLabel.TextColor3 = Color3.fromRGB(100, 100, 130) OddsLabel.BackgroundTransparency = 1 local CountsLabel = Instance.new("TextLabel", OddsFrame) CountsLabel.Position = UDim2.fromOffset(0, 57) CountsLabel.Size = UDim2.new(1, 0, 0, 14) CountsLabel.Text = "" CountsLabel.Font = Enum.Font.Code CountsLabel.TextSize = 10 CountsLabel.TextColor3 = Color3.fromRGB(80, 80, 110) CountsLabel.BackgroundTransparency = 1 local RecommendFrame = Instance.new("Frame", Main) RecommendFrame.Position = UDim2.fromOffset(10, 344) RecommendFrame.Size = UDim2.new(1, -20, 0, 42) RecommendFrame.BackgroundColor3 = Color3.fromRGB(18, 18, 26) RecommendFrame.BorderSizePixel = 0 Instance.new("UICorner", RecommendFrame).CornerRadius = UDim.new(0, 6) local RecommendLbl = Instance.new("TextLabel", RecommendFrame) RecommendLbl.Size = UDim2.new(1, 0, 0.5, 0) RecommendLbl.Position = UDim2.fromOffset(0, 2) RecommendLbl.Text = "RECOMMENDATION" RecommendLbl.Font = Enum.Font.GothamBold RecommendLbl.TextSize = 15 RecommendLbl.TextColor3 = Color3.fromRGB(180, 180, 200) RecommendLbl.BackgroundTransparency = 1 local RecommendSub = Instance.new("TextLabel", RecommendFrame) RecommendSub.Size = UDim2.new(1, 0, 0.5, 0) RecommendSub.Position = UDim2.new(0, 0, 0.5, 0) RecommendSub.Text = "" RecommendSub.Font = Enum.Font.Gotham RecommendSub.TextSize = 11 RecommendSub.TextColor3 = Color3.fromRGB(120, 120, 150) RecommendSub.BackgroundTransparency = 1 local HistRow = Instance.new("Frame", Main) HistRow.Position = UDim2.fromOffset(10, 394) HistRow.Size = UDim2.new(1, -20, 0, 16) HistRow.BackgroundTransparency = 1 local HistLayout = Instance.new("UIListLayout", HistRow) HistLayout.FillDirection = Enum.FillDirection.Horizontal HistLayout.Padding = UDim.new(0, 3) local histDots = {} for i = 1, 18 do local dot = Instance.new("Frame", HistRow) dot.Size = UDim2.fromOffset(9, 14) dot.BackgroundColor3 = Color3.fromRGB(30, 30, 42) dot.BorderSizePixel = 0 Instance.new("UICorner", dot).CornerRadius = UDim.new(0, 3) histDots[i] = dot end local LastShotLbl = Instance.new("TextLabel", Main) LastShotLbl.Position = UDim2.fromOffset(10, 413) LastShotLbl.Size = UDim2.new(1, -20, 0, 14) LastShotLbl.Text = "" LastShotLbl.Font = Enum.Font.GothamBold LastShotLbl.TextSize = 10 LastShotLbl.TextColor3 = Color3.fromRGB(120, 120, 150) LastShotLbl.BackgroundTransparency = 1 local function updateRecommendation(chance) if not roundActive or liveLeft + blankLeft <= 0 then RecommendLbl.Text = "RECOMMENDATION" RecommendLbl.TextColor3 = Color3.fromRGB(180, 180, 200) RecommendSub.Text = "" RecommendFrame.BackgroundColor3 = Color3.fromRGB(18, 18, 26) return end if chance >= 75 then RecommendLbl.Text = "SHOOT OPPONENT" RecommendLbl.TextColor3 = Color3.fromRGB(255, 60, 60) RecommendSub.Text = chance .. "% live — punish opponent" RecommendFrame.BackgroundColor3 = Color3.fromRGB(38, 10, 10) elseif chance >= 55 then RecommendLbl.Text = "SHOOT OPPONENT" RecommendLbl.TextColor3 = Color3.fromRGB(255, 140, 40) RecommendSub.Text = chance .. "% live — use magnifying glass first if available" RecommendFrame.BackgroundColor3 = Color3.fromRGB(35, 22, 8) elseif chance <= 25 then RecommendLbl.Text = "SHOOT YOURSELF" RecommendLbl.TextColor3 = Color3.fromRGB(60, 200, 120) RecommendSub.Text = chance .. "% live — likely blank, free extra turn" RecommendFrame.BackgroundColor3 = Color3.fromRGB(8, 30, 16) elseif chance <= 45 then RecommendLbl.Text = "SHOOT YOURSELF" RecommendLbl.TextColor3 = Color3.fromRGB(120, 200, 80) RecommendSub.Text = chance .. "% live — slight blank lean, consider item first" RecommendFrame.BackgroundColor3 = Color3.fromRGB(12, 26, 10) else RecommendLbl.Text = "USE MAGNIFYING GLASS" RecommendLbl.TextColor3 = Color3.fromRGB(180, 180, 60) RecommendSub.Text = chance .. "% live — 50/50, get info before shooting" RecommendFrame.BackgroundColor3 = Color3.fromRGB(26, 26, 10) end end local function updateUI() local total = liveLeft + blankLeft if total <= 0 or not roundActive then OddsPercent.Text = "--" OddsLabel.Text = roundActive and "All shells fired!" or "Waiting for round" OddsPercent.TextColor3 = Color3.fromRGB(100, 100, 130) OddsFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 26) CountsLabel.Text = "" updateRecommendation(0) return end local chance = math.floor(liveLeft / total * 100) OddsPercent.Text = chance .. "%" OddsLabel.Text = string.format("LIVE — %d live / %d blank", liveLeft, blankLeft) CountsLabel.Text = total .. " shells remaining" if chance >= 70 then OddsPercent.TextColor3 = Color3.fromRGB(255, 60, 60) OddsFrame.BackgroundColor3 = Color3.fromRGB(40, 12, 12) elseif chance >= 40 then OddsPercent.TextColor3 = Color3.fromRGB(255, 200, 60) OddsFrame.BackgroundColor3 = Color3.fromRGB(35, 28, 8) else OddsPercent.TextColor3 = Color3.fromRGB(60, 220, 120) OddsFrame.BackgroundColor3 = Color3.fromRGB(10, 32, 18) end for i = 1, 18 do local s = shotHistory[i] histDots[i].BackgroundColor3 = s == "live" and Color3.fromRGB(200, 40, 40) or s == "blank" and Color3.fromRGB(40, 100, 200) or Color3.fromRGB(30, 30, 42) end updateRecommendation(chance) end local function setShells(live, blank, source) liveLeft = live blankLeft = blank roundActive = true shotHistory = {} StatusLbl.Text = (source or "Table " .. tostring(myTableIndex)) .. " | " .. live .. "L / " .. blank .. "B" StatusLbl.TextColor3 = Color3.fromRGB(80, 220, 120) StatusBar.BackgroundColor3 = Color3.fromRGB(12, 28, 16) updateUI() end local function doWipe() liveLeft = 0 blankLeft = 0 roundActive = false shotHistory = {} lastShotTick = 0 liveBox.Text = "" blankBox.Text = "" LastShotLbl.Text = "" TurnLbl.Text = "Waiting..." TurnLbl.TextColor3 = Color3.fromRGB(120, 120, 150) TurnBar.BackgroundColor3 = Color3.fromRGB(20, 20, 30) StatusLbl.Text = "Wiped — set shells to start again" StatusLbl.TextColor3 = Color3.fromRGB(255, 200, 60) StatusBar.BackgroundColor3 = Color3.fromRGB(30, 24, 8) updateUI() end local function recordShot(isLive, shooterName) if not roundActive then return end local now = tick() if now - lastShotTick < 0.3 then return end lastShotTick = now if isLive then liveLeft = math.max(0, liveLeft - 1) table.insert(shotHistory, 1, "live") LastShotLbl.Text = (shooterName or "?") .. " LIVE" LastShotLbl.TextColor3 = Color3.fromRGB(255, 80, 80) else blankLeft = math.max(0, blankLeft - 1) table.insert(shotHistory, 1, "blank") LastShotLbl.Text = (shooterName or "?") .. " BLANK" LastShotLbl.TextColor3 = Color3.fromRGB(80, 160, 255) end while #shotHistory > 18 do table.remove(shotHistory) end if liveLeft + blankLeft <= 0 then roundActive = false StatusLbl.Text = "All fired — waiting for new round" StatusLbl.TextColor3 = Color3.fromRGB(120, 120, 150) StatusBar.BackgroundColor3 = Color3.fromRGB(20, 20, 30) end updateUI() end local function applyInverter(knownNewState) if not roundActive then return end local total = liveLeft + blankLeft if total <= 0 then return end if knownNewState ~= nil then if knownNewState then blankLeft = math.max(0, blankLeft - 1) liveLeft = liveLeft + 1 LastShotLbl.Text = "Inverter — shell is now LIVE" LastShotLbl.TextColor3 = Color3.fromRGB(255, 80, 80) else liveLeft = math.max(0, liveLeft - 1) blankLeft = blankLeft + 1 LastShotLbl.Text = "Inverter — shell is now BLANK" LastShotLbl.TextColor3 = Color3.fromRGB(80, 160, 255) end else if liveLeft > 0 and blankLeft > 0 then if liveLeft / total >= 0.5 then liveLeft = liveLeft - 1 blankLeft = blankLeft + 1 LastShotLbl.Text = "Inverter — LIVE > BLANK" LastShotLbl.TextColor3 = Color3.fromRGB(80, 160, 255) else blankLeft = blankLeft - 1 liveLeft = liveLeft + 1 LastShotLbl.Text = "Inverter — BLANK > LIVE" LastShotLbl.TextColor3 = Color3.fromRGB(255, 80, 80) end elseif liveLeft > 0 then liveLeft = liveLeft - 1 blankLeft = blankLeft + 1 LastShotLbl.Text = "Inverter — LIVE > BLANK" LastShotLbl.TextColor3 = Color3.fromRGB(80, 160, 255) elseif blankLeft > 0 then blankLeft = blankLeft - 1 liveLeft = liveLeft + 1 LastShotLbl.Text = "Inverter — BLANK > LIVE" LastShotLbl.TextColor3 = Color3.fromRGB(255, 80, 80) end end updateUI() end local function applyEject(knownType) if not roundActive then return end local total = liveLeft + blankLeft if total <= 0 then return end if knownType == true then liveLeft = math.max(0, liveLeft - 1) LastShotLbl.Text = "Ejected — LIVE shell removed" LastShotLbl.TextColor3 = Color3.fromRGB(255, 80, 80) elseif knownType == false then blankLeft = math.max(0, blankLeft - 1) LastShotLbl.Text = "Ejected — BLANK shell removed" LastShotLbl.TextColor3 = Color3.fromRGB(80, 160, 255) else if liveLeft / total >= 0.5 then liveLeft = math.max(0, liveLeft - 1) LastShotLbl.Text = "Ejected — likely LIVE removed" LastShotLbl.TextColor3 = Color3.fromRGB(255, 160, 40) else blankLeft = math.max(0, blankLeft - 1) LastShotLbl.Text = "Ejected — likely BLANK removed" LastShotLbl.TextColor3 = Color3.fromRGB(120, 180, 255) end end updateUI() end local function startAutoRead() if autoReadConn then autoReadConn:Disconnect() autoReadConn = nil end local tableModel = getTableModel() if not tableModel then StatusLbl.Text = "Table model not found in workspace" StatusLbl.TextColor3 = Color3.fromRGB(255, 80, 80) return end local gp = tableModel:FindFirstChild("gameProps") if not gp then return end local shotgun = gp:FindFirstChild("shotgun") if not shotgun then return end local function readAndSetShells() local live = 0 local blank = 0 for _, desc in ipairs(shotgun:GetDescendants()) do local name = desc.Name:lower() if desc:IsA("BoolValue") then if name == "islive" or name == "live" then if desc.Value then live = live + 1 else blank = blank + 1 end end elseif desc:IsA("StringValue") then if name == "type" or name == "shelltype" or name == "kind" then local v = desc.Value:lower() if v == "live" or v == "l" or v == "red" then live = live + 1 elseif v == "blank" or v == "b" or v == "blue" or v == "h" then blank = blank + 1 end end elseif desc:IsA("IntValue") or desc:IsA("NumberValue") then if name == "live" or name == "islive" then if desc.Value == 1 then live = live + 1 else blank = blank + 1 end end end for k, v in pairs(desc:GetAttributes()) do local kl = tostring(k):lower() if kl == "islive" or kl == "live" then if v == true or v == 1 or tostring(v):lower() == "live" then live = live + 1 else blank = blank + 1 end end end end for k, v in pairs(shotgun:GetAttributes()) do local kl = tostring(k):lower() if kl == "live" or kl == "livecount" then if type(v) == "number" then live = v end elseif kl == "blank" or kl == "blankcount" then if type(v) == "number" then blank = v end end end if live + blank > 0 then setShells(live, blank, "Auto (table " .. tostring(myTableIndex) .. ")") return true end return false end local found = readAndSetShells() autoReadConn = shotgun.DescendantAdded:Connect(function() task.wait(0.1) readAndSetShells() end) shotgun.DescendantRemoving:Connect(function() task.wait(0.1) readAndSetShells() end) for _, desc in ipairs(shotgun:GetDescendants()) do pcall(function() desc.AttributeChanged:Connect(function() task.wait(0.05) readAndSetShells() end) end) end if not found then StatusLbl.Text = "Table " .. tostring(myTableIndex) .. " found — waiting for shells" StatusLbl.TextColor3 = Color3.fromRGB(255, 200, 60) end end setTableBtn.MouseButton1Click:Connect(function() local n = tonumber(tableNumBox.Text) if not n then setTableBtn.Text = "Invalid!" task.delay(1, function() setTableBtn.Text = "Set Table" end) return end myTableIndex = n tableStroke.Color = Color3.fromRGB(80, 220, 120) setTableBtn.Text = "Table " .. n .. " ✓" setTableBtn.BackgroundColor3 = Color3.fromRGB(40, 120, 60) startAutoRead() end) SetBtn.MouseButton1Click:Connect(function() if not myTableIndex then SetBtn.Text = "Set table first!" task.delay(1.5, function() SetBtn.Text = "Set Manually" end) return end local l = tonumber(liveBox.Text) local b = tonumber(blankBox.Text) if not l or not b or l < 0 or b < 0 then SetBtn.Text = "Invalid!" task.delay(1, function() SetBtn.Text = "Set Manually" end) return end setShells(l, b, "Manual") liveBox.Text = "" blankBox.Text = "" end) WipeBtn.MouseButton1Click:Connect(function() doWipe() WipeBtn.Text = "Wiped!" WipeBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 80) task.delay(1.2, function() WipeBtn.Text = "Wipe" WipeBtn.BackgroundColor3 = Color3.fromRGB(120, 30, 30) end) end) local visualsRemote = remotes:FindFirstChild("Visuals") if visualsRemote then visualsRemote.OnClientEvent:Connect(function(a1, a2, a3, a4, a5, a6, a7, a8) if not myTableIndex then return end if a2 ~= myTableIndex then return end if a1 == "shootShotgun" then if not roundActive then return end if typeof(a4) ~= "boolean" then return end local shooterName = "?" if typeof(a3) == "Instance" and a3:IsA("Player") then shooterName = a3 == LocalPlayer and "YOU" or a3.Name end recordShot(a4, shooterName) elseif a1 == "ejectShell" or a1 == "shellEject" or a1 == "removeShell" or a1 == "chamberEject" or a1 == "dropShell" then applyEject(typeof(a4) == "boolean" and a4 or nil) elseif a1 == "invertShell" or a1 == "shellInverted" or a1 == "inverterUsed" or a1 == "shellFlipped" then applyInverter(typeof(a4) == "boolean" and a4 or nil) elseif a1 == "remoteDetonate" or a1 == "remoteFire" or a1 == "detonateShell" then if not roundActive then return end if typeof(a4) ~= "boolean" then return end local shooterName = "Remote" if typeof(a3) == "Instance" and a3:IsA("Player") then shooterName = (a3 == LocalPlayer and "YOU" or a3.Name) .. " (remote)" end recordShot(a4, shooterName) end end) end local playerActionRemote = remotes:FindFirstChild("PlayerAction") if playerActionRemote then playerActionRemote.OnClientEvent:Connect(function(a1, a2, a3, a4) if not myTableIndex then return end if a1 ~= myTableIndex then return end if typeof(a2) == "Instance" and a2:IsA("Player") then if a2 == LocalPlayer then TurnLbl.Text = "YOUR TURN" TurnLbl.TextColor3 = Color3.fromRGB(80, 220, 120) TurnBar.BackgroundColor3 = Color3.fromRGB(10, 28, 14) else TurnLbl.Text = "Turn: " .. a2.Name TurnLbl.TextColor3 = Color3.fromRGB(180, 140, 60) TurnBar.BackgroundColor3 = Color3.fromRGB(28, 22, 8) end end if typeof(a3) ~= "string" or not roundActive then return end local total = liveLeft + blankLeft if a3 == "hacksaw" and total > 0 then applyEject(nil) elseif a3 == "inverter" and total > 0 then applyInverter(nil) elseif a3 == "remote" then LastShotLbl.Text = "Remote detonator used..." LastShotLbl.TextColor3 = Color3.fromRGB(180, 120, 255) end end) end local setTurnText = remotes:FindFirstChild("SetTurnText") if setTurnText then setTurnText.OnClientEvent:Connect(function(a1, a2) if a1 ~= true then return end if typeof(a2) == "Instance" and a2:IsA("Player") and a2 == LocalPlayer then TurnLbl.Text = "YOUR TURN" TurnLbl.TextColor3 = Color3.fromRGB(80, 220, 120) TurnBar.BackgroundColor3 = Color3.fromRGB(10, 28, 14) elseif typeof(a2) == "number" then TurnLbl.Text = "Opponent's turn" TurnLbl.TextColor3 = Color3.fromRGB(180, 140, 60) TurnBar.BackgroundColor3 = Color3.fromRGB(28, 22, 8) end end) end local recoverRemote = remotes:FindFirstChild("RecoverShotgun") if recoverRemote then recoverRemote.OnClientEvent:Connect(function(a1) if myTableIndex and a1 ~= myTableIndex then return end roundActive = false liveLeft = 0 blankLeft = 0 shotHistory = {} StatusLbl.Text = "New round — auto-reading shells..." StatusLbl.TextColor3 = Color3.fromRGB(255, 200, 60) StatusBar.BackgroundColor3 = Color3.fromRGB(30, 24, 8) TurnLbl.Text = "Waiting..." TurnLbl.TextColor3 = Color3.fromRGB(100, 100, 130) TurnBar.BackgroundColor3 = Color3.fromRGB(20, 20, 30) LastShotLbl.Text = "" updateUI() task.delay(0.5, function() if myTableIndex then startAutoRead() end end) end) end local playerTurnRemote = remotes:FindFirstChild("PlayerTurn") if playerTurnRemote then playerTurnRemote.OnClientEvent:Connect(function(a1) if a1 == true then TurnLbl.Text = "YOUR TURN" TurnLbl.TextColor3 = Color3.fromRGB(80, 220, 120) TurnBar.BackgroundColor3 = Color3.fromRGB(10, 28, 14) end end) end CloseBtn.MouseButton1Click:Connect(function() if autoReadConn then autoReadConn:Disconnect() end ScreenGui:Destroy() end) updateUI() end)