grok gui open source for shooter games
Key RequiredUniversal

grok gui open source for shooter games

Universal Scriptfyu6tucdgt57dt57de5fyu6tucdgt57dt57de5 551 views 31 executesUpdated Mar 26, 2026
2.5/ 5(2 votes)
1150% Positive
Lua Script•437 lines (13025 chars)
-- Grok GUI | Fixed Stable Triggerbot + FOV Circle

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

local localPlayer = Players.LocalPlayer
local camera = workspace.CurrentCamera

-- Anti Double Load + Full Cleanup
if _G.GrokGUI then
	if _G.GrokGUI.gui then _G.GrokGUI.gui:Destroy() end
	if _G.GrokGUI.connections then
		for _, c in pairs(_G.GrokGUI.connections) do c:Disconnect() end
	end
	for _, data in pairs(_G.GrokGUI.drawings or {}) do
		if data.box then data.box:Remove() end
		if data.name then data.name:Remove() end
		if data.dist then data.dist:Remove() end
	end
	if _G.GrokGUI.fovCircle then _G.GrokGUI.fovCircle:Remove() end
	_G.GrokGUI = nil
	return
end

_G.GrokGUI = { 
	gui = nil, 
	connections = {}, 
	drawings = {},
	fovCircle = nil 
}

-- ================== SETTINGS ==================
local ESP_Enabled = true
local Aimbot_Enabled = true
local SilentAim_Enabled = true
local Triggerbot_Enabled = true
local TeamCheck_Enabled = false
local AliveCheck_Enabled = true

local AIM_PART = "Head"
local AIM_FOV = 180
local AIM_SMOOTHNESS = 5
local PREDICTION = 0.14
local FIRE_RATE = 0.09        -- Slightly increased to reduce spam
local WALLCHECK = true

local currentTarget = nil
local targetLockTime = 0
local lastShotTime = 0
local triggerDebounce = 0     -- New: prevents spam clicking

-- Silent Aim
local mt = getrawmetatable(game)
local oldNamecall = mt.__namecall
setreadonly(mt, false)

mt.__namecall = newcclosure(function(self, ...)
	local method = getnamecallmethod()
	local args = {...}
	if SilentAim_Enabled and method == "FireServer" then
		local name = self.Name:lower()
		if name:find("bullet") or name:find("shoot") or name:find("hit") or name:find("damage") then
			if currentTarget then
				args[1] = currentTarget.Position
			end
		end
	end
	return oldNamecall(self, unpack(args))
end)
setreadonly(mt, true)

-- ================== FOV CIRCLE ==================
local fovCircle = Drawing.new("Circle")
fovCircle.Thickness = 2
fovCircle.Color = Color3.fromRGB(0, 170, 255)
fovCircle.Filled = false
fovCircle.Transparency = 0.6
fovCircle.NumSides = 64
fovCircle.Visible = false
_G.GrokGUI.fovCircle = fovCircle

-- ================== DRAWINGS ==================
local drawings = {}
_G.GrokGUI.drawings = drawings

local function createDrawings(player)
	if player == localPlayer then return end
	
	local box = Drawing.new("Square")
	box.Thickness = 2; box.Color = Color3.fromRGB(0, 255, 100); box.Filled = false; box.Transparency = 1; box.Visible = false

	local nameText = Drawing.new("Text")
	nameText.Size = 16; nameText.Center = true; nameText.Outline = true; nameText.Color = Color3.new(1,1,1); nameText.Visible = false

	local distText = Drawing.new("Text")
	distText.Size = 14; distText.Center = true; distText.Outline = true; distText.Color = Color3.new(1,1,1); distText.Visible = false

	drawings[player] = {box = box, name = nameText, dist = distText}
end

local function isAlive(char)
	if not AliveCheck_Enabled then return true end
	local hum = char:FindFirstChild("Humanoid")
	return hum and hum.Health > 0
end

local function isVisible(part)
	if not WALLCHECK then return true end
	local blacklist = {}
	for _, v in pairs(localPlayer.Character:GetDescendants()) do
		if v:IsA("BasePart") then table.insert(blacklist, v) end
	end
	for _, v in pairs(part.Parent:GetDescendants()) do
		if v:IsA("BasePart") then table.insert(blacklist, v) end
	end
	return #camera:GetPartsObscuringTarget({part.Position}, blacklist) == 0
end

-- ================== GROK GUI ==================
local screenGui = Instance.new("ScreenGui")
screenGui.ResetOnSpawn = false
screenGui.Parent = localPlayer:WaitForChild("PlayerGui")
_G.GrokGUI.gui = screenGui

local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 340, 0, 580)
mainFrame.Position = UDim2.new(0.5, -170, 0.1, 0)
mainFrame.BackgroundColor3 = Color3.fromRGB(28, 28, 28)
mainFrame.BorderSizePixel = 0
mainFrame.Parent = screenGui

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 50)
title.BackgroundColor3 = Color3.fromRGB(0, 110, 200)
title.Text = "Grok GUI"
title.TextColor3 = Color3.new(1,1,1)
title.Font = Enum.Font.GothamBold
title.TextSize = 22
title.Parent = mainFrame

local titleCorner = Instance.new("UICorner")
titleCorner.CornerRadius = UDim.new(0, 12)
titleCorner.Parent = mainFrame

local scrolling = Instance.new("ScrollingFrame")
scrolling.Size = UDim2.new(1, -24, 1, -70)
scrolling.Position = UDim2.new(0, 12, 0, 60)
scrolling.BackgroundTransparency = 1
scrolling.ScrollBarThickness = 6
scrolling.ScrollBarImageColor3 = Color3.fromRGB(70, 70, 70)
scrolling.Parent = mainFrame

local listLayout = Instance.new("UIListLayout")
listLayout.Padding = UDim.new(0, 14)
listLayout.SortOrder = Enum.SortOrder.LayoutOrder
listLayout.Parent = scrolling

listLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
	scrolling.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 30)
end)

-- Draggable
local dragging = false
local dragStart, startPos
mainFrame.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 then
		dragging = true
		dragStart = input.Position
		startPos = mainFrame.Position
	end
end)

UserInputService.InputChanged:Connect(function(input)
	if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
		local delta = input.Position - dragStart
		mainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
	end
end)

mainFrame.InputEnded:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
end)

-- Toggle Button
local function createToggle(name, default, callback)
	local btn = Instance.new("TextButton")
	btn.Size = UDim2.new(1, 0, 0, 46)
	btn.BackgroundColor3 = default and Color3.fromRGB(0, 170, 0) or Color3.fromRGB(170, 0, 0)
	btn.Text = name .. ": " .. (default and "ON" or "OFF")
	btn.TextColor3 = Color3.new(1,1,1)
	btn.Font = Enum.Font.GothamSemibold
	btn.TextSize = 16
	btn.AutoButtonColor = false
	btn.Parent = scrolling

	local corner = Instance.new("UICorner")
	corner.CornerRadius = UDim.new(0, 8)
	corner.Parent = btn

	btn.MouseButton1Click:Connect(function()
		default = not default
		btn.Text = name .. ": " .. (default and "ON" or "OFF")
		btn.BackgroundColor3 = default and Color3.fromRGB(0, 170, 0) or Color3.fromRGB(170, 0, 0)
		callback(default)
	end)
end

-- TextBox with auto correction
local function createTextBox(name, minVal, maxVal, defaultVal, callback)
	local frame = Instance.new("Frame")
	frame.Size = UDim2.new(1, 0, 0, 70)
	frame.BackgroundTransparency = 1
	frame.Parent = scrolling

	local label = Instance.new("TextLabel")
	label.Size = UDim2.new(1, 0, 0, 22)
	label.BackgroundTransparency = 1
	label.Text = name .. " (" .. minVal .. " - " .. maxVal .. ")"
	label.TextColor3 = Color3.new(1,1,1)
	label.Font = Enum.Font.Gotham
	label.TextSize = 15
	label.Parent = frame

	local textbox = Instance.new("TextBox")
	textbox.Size = UDim2.new(1, 0, 0, 40)
	textbox.Position = UDim2.new(0, 0, 0, 28)
	textbox.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
	textbox.Text = tostring(defaultVal)
	textbox.TextColor3 = Color3.new(1,1,1)
	textbox.Font = Enum.Font.Gotham
	textbox.TextSize = 16
	textbox.ClearTextOnFocus = false
	textbox.Parent = frame

	local corner = Instance.new("UICorner")
	corner.CornerRadius = UDim.new(0, 8)
	corner.Parent = textbox

	textbox.FocusLost:Connect(function()
		local num = tonumber(textbox.Text)
		if not num then
			textbox.Text = tostring(defaultVal)
			callback(defaultVal)
			return
		end

		if num < minVal then num = minVal
		elseif num > maxVal then num = maxVal end

		textbox.Text = tostring(num)
		defaultVal = num
		callback(num)
	end)

	callback(defaultVal)
end

-- Create UI
createToggle("ESP", ESP_Enabled, function(v) ESP_Enabled = v end)
createToggle("Aimbot", Aimbot_Enabled, function(v) Aimbot_Enabled = v end)
createToggle("Silent Aim", SilentAim_Enabled, function(v) SilentAim_Enabled = v end)
createToggle("Triggerbot", Triggerbot_Enabled, function(v) Triggerbot_Enabled = v end)

createTextBox("Aim FOV", 60, 300, AIM_FOV, function(v) AIM_FOV = v end)
createTextBox("Smoothness", 1, 12, AIM_SMOOTHNESS, function(v) AIM_SMOOTHNESS = v end)
createTextBox("Prediction", 0, 0.25, PREDICTION, function(v) PREDICTION = v end)
createTextBox("Fire Rate", 0.03, 0.20, FIRE_RATE, function(v) FIRE_RATE = v end)

createToggle("Team Check", TeamCheck_Enabled, function(v) TeamCheck_Enabled = v end)
createToggle("Alive Check", AliveCheck_Enabled, function(v) AliveCheck_Enabled = v end)

-- ================== MAIN LOOP ==================
local function getBestTarget()
	local closest = nil
	local shortest = AIM_FOV

	for _, plr in ipairs(Players:GetPlayers()) do
		if plr ~= localPlayer and plr.Character then
			local char = plr.Character
			local part = char:FindFirstChild(AIM_PART)
			if not isAlive(char) then continue end
			if TeamCheck_Enabled and plr.Team == localPlayer.Team then continue end
			if not part then continue end

			local screenPos, onScreen = camera:WorldToViewportPoint(part.Position)
			if not onScreen then continue end

			local mousePos = UserInputService:GetMouseLocation()
			local dist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude

			if currentTarget and currentTarget.Parent == char and isVisible(part) then
				return part
			end

			if dist < shortest and isVisible(part) then
				shortest = dist
				closest = part
			end
		end
	end
	return closest
end

local function updateAimbot()
	if not Aimbot_Enabled then 
		currentTarget = nil 
		return 
	end

	local targetPart = getBestTarget()

	if targetPart then
		if targetPart ~= currentTarget then
			if not currentTarget or (tick() - targetLockTime > 0.35) then
				currentTarget = targetPart
				targetLockTime = tick()
			end
		end
	else
		currentTarget = nil
	end

	if currentTarget then
		local root = currentTarget.Parent:FindFirstChild("HumanoidRootPart")
		local aimPos = currentTarget.Position
		if root then
			aimPos = aimPos + (root.Velocity * PREDICTION)
		end

		local targetCFrame = CFrame.new(camera.CFrame.Position, aimPos)
		camera.CFrame = camera.CFrame:Lerp(targetCFrame, 1 / AIM_SMOOTHNESS)
	end
end

-- Fixed Triggerbot (Stable click simulation)
local function updateTriggerbot()
	if not Triggerbot_Enabled or not currentTarget then return end
	if not isAlive(currentTarget.Parent) then 
		currentTarget = nil 
		return 
	end
	if not isVisible(currentTarget) then return end

	local now = tick()
	if now - lastShotTime < FIRE_RATE then return end
	if now - triggerDebounce < 0.08 then return end   -- Extra debounce

	-- Proper click simulation
	mouse1press()
	task.wait(0.015)
	mouse1release()

	lastShotTime = now
	triggerDebounce = now
end

local function updateESP()
	if not ESP_Enabled then
		for _, d in pairs(drawings) do
			d.box.Visible = false
			d.name.Visible = false
			d.dist.Visible = false
		end
		return
	end

	for player, data in pairs(drawings) do
		local char = player.Character
		if not char or not isAlive(char) then
			data.box.Visible = false
			data.name.Visible = false
			data.dist.Visible = false
			continue
		end

		local root = char:FindFirstChild("HumanoidRootPart")
		local head = char:FindFirstChild("Head")
		if not root or not head then
			data.box.Visible = false
			data.name.Visible = false
			data.dist.Visible = false
			continue
		end

		local rootPos, onScreen = camera:WorldToViewportPoint(root.Position)
		local headPos = camera:WorldToViewportPoint(head.Position + Vector3.new(0, 0.5, 0))

		if onScreen then
			local height = (camera:WorldToViewportPoint(root.Position - Vector3.new(0, 3, 0)).Y - headPos.Y) * 1.1
			local width = height * 0.6

			data.box.Size = Vector2.new(width, height)
			data.box.Position = Vector2.new(rootPos.X - width/2, headPos.Y)
			data.box.Visible = true

			data.name.Text = player.Name
			data.name.Position = Vector2.new(rootPos.X, headPos.Y - 22)
			data.name.Visible = true

			local dist = (root.Position - camera.CFrame.Position).Magnitude
			data.dist.Text = string.format("%.0f studs", dist)
			data.dist.Position = Vector2.new(rootPos.X, rootPos.Y + height/2 + 8)
			data.dist.Visible = true
		else
			data.box.Visible = false
			data.name.Visible = false
			data.dist.Visible = false
		end
	end
end

-- Update FOV Circle
local function updateFOVCircle()
	if not Aimbot_Enabled then
		fovCircle.Visible = false
		return
	end

	fovCircle.Visible = true
	fovCircle.Radius = AIM_FOV
	fovCircle.Position = UserInputService:GetMouseLocation()
end

-- Main Loop
local mainConn = RunService.RenderStepped:Connect(function()
	updateESP()
	updateAimbot()
	updateTriggerbot()
	updateFOVCircle()
end)

table.insert(_G.GrokGUI.connections, mainConn)

-- Setup players
for _, plr in ipairs(Players:GetPlayers()) do createDrawings(plr) end
Players.PlayerAdded:Connect(createDrawings)

Features & Information

silent aim triggerbot aimbot esp

Community Comments (1)

breezipsettingsbreezipsettingsMar 26, 2026

this script is not compatible with xeno.

More Scripts for Universal Scripts