NOT FE Reality Bender GUI
Key RequiredUniversal

NOT FE Reality Bender GUI

Universal Scriptddorredoreddorredore 742 views 287 executesUpdated Mar 27, 2026
Unrated
00
Lua Script•644 lines (17469 chars)
--// Reality Bender GUI
--// Put this LocalScript in StarterPlayerScripts or StarterGui
--// Local visual effect GUI

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

local player = Players.LocalPlayer
local rng = Random.new()

--========================
-- EDIT HERE
--========================
local guiTitle = "Reality Bender"
local mainButtonText = "BEND!"
local smallButtonText = "Open"

local bendSpeed = 4
local bendStrength = 0.25
local bendRange = 80
local defaultAxis = "Y" -- Y, X, Z
--========================

local axisList = {"Y", "X", "Z"}
local axisIndex = 1
for i, v in ipairs(axisList) do
	if v == defaultAxis then
		axisIndex = i
		break
	end
end

local bendOn = false
local chaosOn = false
local maxChaosOn = false
local bendToken = 0
local chaosToken = 0

local originalState = {} -- [part] = {CFrame=, Size=, Color=, Material=, Transparency=}
local affectedParts = {}

local materialList = {
	Enum.Material.Plastic,
	Enum.Material.SmoothPlastic,
	Enum.Material.Neon,
	Enum.Material.Wood,
	Enum.Material.WoodPlanks,
	Enum.Material.Glass,
	Enum.Material.Concrete,
	Enum.Material.Granite,
	Enum.Material.Slate,
	Enum.Material.Metal,
	Enum.Material.CorrodedMetal,
	Enum.Material.DiamondPlate,
	Enum.Material.Foil,
	Enum.Material.Ice,
	Enum.Material.Fabric,
	Enum.Material.Grass,
	Enum.Material.Pebble,
	Enum.Material.ForceField,
}

local character = player.Character or player.CharacterAdded:Wait()
local humanoidRootPart = character:WaitForChild("HumanoidRootPart")

local function updateCharacter()
	character = player.Character or player.CharacterAdded:Wait()
	humanoidRootPart = character:WaitForChild("HumanoidRootPart")
end

player.CharacterAdded:Connect(function()
	task.wait(1)
	updateCharacter()
end)

local function trimText(s)
	return (tostring(s or ""):gsub("^%s+", ""):gsub("%s+$", ""))
end

local function parseNumber(text, fallback, minValue, maxValue)
	local n = tonumber(trimText(text))
	if not n then
		return fallback
	end
	if minValue then
		n = math.max(minValue, n)
	end
	if maxValue then
		n = math.min(maxValue, n)
	end
	return n
end

local function getAxisCFrame(axis, amount)
	if axis == "X" then
		return CFrame.Angles(amount, 0, 0)
	elseif axis == "Z" then
		return CFrame.Angles(0, 0, amount)
	else
		return CFrame.Angles(0, amount, 0)
	end
end

local function getAllParts()
	local parts = {}
	for _, obj in ipairs(workspace:GetDescendants()) do
		if obj:IsA("BasePart") then
			parts[#parts + 1] = obj
		end
	end
	return parts
end

local function saveOriginal(part)
	if originalState[part] or not part or not part.Parent then
		return
	end

	originalState[part] = {
		CFrame = part.CFrame,
		Size = part.Size,
		Color = part.Color,
		Material = part.Material,
		Transparency = part.Transparency,
	}
end

local function restorePart(part)
	local old = originalState[part]
	if not old or not part or not part.Parent then
		return
	end

	part.CFrame = old.CFrame
	part.Size = old.Size
	part.Color = old.Color
	part.Material = old.Material
	part.Transparency = old.Transparency
	originalState[part] = nil
end

local function restoreAll()
	bendOn = false
	chaosOn = false
	maxChaosOn = false
	bendToken += 1
	chaosToken += 1

	for part, _ in pairs(originalState) do
		restorePart(part)
	end
	table.clear(affectedParts)
end

local function getPartsInRange(centerPos, range)
	local list = {}
	for _, part in ipairs(getAllParts()) do
		if part.Parent and (part.Position - centerPos).Magnitude <= range then
			list[#list + 1] = part
		end
	end
	return list
end

local function applyBendStep()
	if chaosOn or maxChaosOn then
		return
	end

	if not humanoidRootPart or not humanoidRootPart.Parent then
		return
	end

	local parts = getPartsInRange(humanoidRootPart.Position, bendRange)
	local t = os.clock()
	local speed = math.max(bendSpeed, 0.1)
	local strength = math.max(bendStrength, 0)

	for _, part in ipairs(parts) do
		if part:IsDescendantOf(player.Character) then
			continue
		end

		saveOriginal(part)

		local old = originalState[part]
		if old then
			local wave = math.sin((t * speed) + (part.Position.X * 0.07) + (part.Position.Z * 0.07))
			local spin = wave * strength * 2

			local bendOffset = Vector3.new(
				math.sin(t * speed + part.Position.Y) * strength,
				math.cos(t * speed + part.Position.X) * strength,
				math.sin(t * speed + part.Position.Z) * strength
			)

			local axis = axisList[axisIndex]
			local newCFrame = old.CFrame
				* CFrame.new(bendOffset)
				* getAxisCFrame(axis, spin)

			part.CFrame = newCFrame
			part.Size = old.Size * (1 + (wave * strength * 0.35))
			part.Color = old.Color
			part.Material = old.Material
		end
	end
end

local function applyChaosStep(multiplier)
	if not humanoidRootPart or not humanoidRootPart.Parent then
		return
	end

	local parts = getPartsInRange(humanoidRootPart.Position, bendRange * multiplier)
	local t = os.clock()
	local speed = math.max(bendSpeed * multiplier, 0.1)
	local strength = math.max(bendStrength * multiplier, 0)

	for _, part in ipairs(parts) do
		if part:IsDescendantOf(player.Character) then
			continue
		end

		saveOriginal(part)

		local old = originalState[part]
		if old then
			local wave = math.sin((t * speed) + (part.Position.X * 0.11) + (part.Position.Z * 0.11))
			local spin = rng:NextNumber(-1, 1) * strength * 6 * multiplier

			local chaosOffset = Vector3.new(
				rng:NextNumber(-strength, strength),
				rng:NextNumber(-strength, strength),
				rng:NextNumber(-strength, strength)
			)

			part.CFrame = old.CFrame
				* CFrame.new(chaosOffset)
				* getAxisCFrame(axisList[axisIndex], spin)

			part.Size = old.Size * (1 + (wave * strength * 0.45))
			part.Color = Color3.fromRGB(
				rng:NextInteger(0, 255),
				rng:NextInteger(0, 255),
				rng:NextInteger(0, 255)
			)
			part.Material = materialList[rng:NextInteger(1, #materialList)]
		end
	end
end

-- GUI
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "RealityBenderGui"
screenGui.ResetOnSpawn = false
screenGui.IgnoreGuiInset = true
screenGui.Parent = player:WaitForChild("PlayerGui")

local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 300, 0, 330)
mainFrame.Position = UDim2.new(0.5, -150, 0.5, -165)
mainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
mainFrame.BorderSizePixel = 0
mainFrame.Active = true
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui

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

local titleBar = Instance.new("TextLabel")
titleBar.Size = UDim2.new(1, 0, 0, 34)
titleBar.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
titleBar.BorderSizePixel = 0
titleBar.Text = guiTitle
titleBar.TextColor3 = Color3.fromRGB(255, 255, 255)
titleBar.TextScaled = true
titleBar.Font = Enum.Font.GothamBold
titleBar.Active = true
titleBar.Parent = mainFrame

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

local hideButton = Instance.new("TextButton")
hideButton.Size = UDim2.new(0, 60, 0, 24)
hideButton.Position = UDim2.new(1, -65, 0, 5)
hideButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
hideButton.Text = "Hide"
hideButton.TextColor3 = Color3.fromRGB(255, 255, 255)
hideButton.TextScaled = true
hideButton.Font = Enum.Font.Gotham
hideButton.BorderSizePixel = 0
hideButton.Parent = mainFrame

local hideCorner = Instance.new("UICorner")
hideCorner.CornerRadius = UDim.new(0, 8)
hideCorner.Parent = hideButton

local closeButton = Instance.new("TextButton")
closeButton.Size = UDim2.new(0, 24, 0, 24)
closeButton.Position = UDim2.new(1, -30, 0, 5)
closeButton.BackgroundColor3 = Color3.fromRGB(170, 50, 50)
closeButton.Text = "X"
closeButton.TextColor3 = Color3.fromRGB(255, 255, 255)
closeButton.TextScaled = true
closeButton.Font = Enum.Font.GothamBold
closeButton.BorderSizePixel = 0
closeButton.Parent = mainFrame

local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 8)
closeCorner.Parent = closeButton

local scrollFrame = Instance.new("ScrollingFrame")
scrollFrame.Size = UDim2.new(1, 0, 1, -34)
scrollFrame.Position = UDim2.new(0, 0, 0, 34)
scrollFrame.BackgroundTransparency = 1
scrollFrame.BorderSizePixel = 0
scrollFrame.ScrollBarThickness = 5
scrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0)
scrollFrame.Parent = mainFrame

local content = Instance.new("Frame")
content.Size = UDim2.new(1, -10, 0, 0)
content.Position = UDim2.new(0, 5, 0, 5)
content.BackgroundTransparency = 1
content.BorderSizePixel = 0
content.Parent = scrollFrame

local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0, 6)
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Parent = content

layout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
	content.Size = UDim2.new(1, -10, 0, layout.AbsoluteContentSize.Y)
	scrollFrame.CanvasSize = UDim2.new(0, 0, 0, layout.AbsoluteContentSize.Y + 10)
end)

local function roundify(obj, radius)
	local c = Instance.new("UICorner")
	c.CornerRadius = UDim.new(0, radius)
	c.Parent = obj
	return c
end

local function makeLabel(text, height)
	local lbl = Instance.new("TextLabel")
	lbl.Size = UDim2.new(1, 0, 0, height or 22)
	lbl.BackgroundTransparency = 1
	lbl.Text = text
	lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
	lbl.TextScaled = true
	lbl.Font = Enum.Font.Gotham
	lbl.Parent = content
	return lbl
end

local function makeBox(labelText, defaultText)
	local row = Instance.new("Frame")
	row.Size = UDim2.new(1, 0, 0, 50)
	row.BackgroundColor3 = Color3.fromRGB(32, 32, 32)
	row.BorderSizePixel = 0
	row.Parent = content
	roundify(row, 10)

	local lbl = Instance.new("TextLabel")
	lbl.Size = UDim2.new(1, -12, 0, 17)
	lbl.Position = UDim2.new(0, 6, 0, 3)
	lbl.BackgroundTransparency = 1
	lbl.Text = labelText
	lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
	lbl.TextScaled = true
	lbl.Font = Enum.Font.Gotham
	lbl.Parent = row

	local box = Instance.new("TextBox")
	box.Size = UDim2.new(1, -12, 0, 22)
	box.Position = UDim2.new(0, 6, 0, 24)
	box.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
	box.Text = defaultText
	box.TextColor3 = Color3.fromRGB(255, 255, 255)
	box.TextScaled = true
	box.Font = Enum.Font.Gotham
	box.BorderSizePixel = 0
	box.ClearTextOnFocus = false
	box.Parent = row
	roundify(box, 8)

	return box
end

local function makeButton(text, color, height)
	local btn = Instance.new("TextButton")
	btn.Size = UDim2.new(1, 0, 0, height or 30)
	btn.BackgroundColor3 = color
	btn.Text = text
	btn.TextColor3 = Color3.fromRGB(255, 255, 255)
	btn.TextScaled = true
	btn.Font = Enum.Font.GothamBold
	btn.BorderSizePixel = 0
	btn.Parent = content
	roundify(btn, 10)
	return btn
end

makeLabel("Reality bending controls", 22)

local speedBox = makeBox("Speed", tostring(bendSpeed))
local strengthBox = makeBox("Strength", tostring(bendStrength))
local rangeBox = makeBox("Range", tostring(bendRange))
local nameBox = makeBox("Button Name", mainButtonText)

local axisButton = makeButton("Axis: " .. axisList[axisIndex], Color3.fromRGB(80, 80, 140), 30)
local bendButton = makeButton(mainButtonText, Color3.fromRGB(50, 120, 50), 34)
local chaosButton = makeButton("CHAOS! : OFF", Color3.fromRGB(150, 90, 40), 34)
local maxChaosButton = makeButton("MAX CHAOS! : OFF", Color3.fromRGB(170, 40, 40), 34)
local resetButton = makeButton("Reset", Color3.fromRGB(120, 60, 60), 34)
local applyNameButton = makeButton("Apply Name", Color3.fromRGB(90, 90, 150), 30)

local statusLabel = makeLabel("Status: Ready", 22)

local smallButton = Instance.new("TextButton")
smallButton.Size = UDim2.new(0, 70, 0, 30)
smallButton.Position = UDim2.new(0, 10, 0.5, -15)
smallButton.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
smallButton.Text = smallButtonText
smallButton.TextColor3 = Color3.fromRGB(255, 255, 255)
smallButton.TextScaled = true
smallButton.Font = Enum.Font.GothamBold
smallButton.BorderSizePixel = 0
smallButton.Visible = false
smallButton.Active = true
smallButton.Parent = screenGui

local smallCorner = Instance.new("UICorner")
smallCorner.CornerRadius = UDim.new(0, 10)
smallCorner.Parent = smallButton

local function updateStatus(text)
	statusLabel.Text = "Status: " .. text
end

local function refreshTexts()
	bendButton.Text = mainButtonText
	axisButton.Text = "Axis: " .. axisList[axisIndex]
	smallButton.Text = smallButtonText
end

axisButton.MouseButton1Click:Connect(function()
	axisIndex += 1
	if axisIndex > #axisList then
		axisIndex = 1
	end
	axisButton.Text = "Axis: " .. axisList[axisIndex]
	updateStatus("Axis changed to " .. axisList[axisIndex])
end)

applyNameButton.MouseButton1Click:Connect(function()
	if nameBox.Text ~= "" then
		mainButtonText = nameBox.Text
		bendButton.Text = mainButtonText
		updateStatus("Button name updated")
	end
end)

bendButton.MouseButton1Click:Connect(function()
	bendOn = not bendOn
	bendToken += 1
	local myToken = bendToken

	if bendOn then
		bendButton.Text = "STOP"
		bendButton.BackgroundColor3 = Color3.fromRGB(170, 60, 60)
		updateStatus("Reality bending")

		task.spawn(function()
			while bendOn and bendToken == myToken and screenGui.Parent do
				updateCharacter()
				bendSpeed = parseNumber(speedBox.Text, bendSpeed, 0.1, 100)
				bendStrength = parseNumber(strengthBox.Text, bendStrength, 0, 10)
				bendRange = parseNumber(rangeBox.Text, bendRange, 1, 500)

				applyBendStep()
				RunService.RenderStepped:Wait()
			end
		end)
	else
		restoreAll()
		bendButton.Text = mainButtonText
		bendButton.BackgroundColor3 = Color3.fromRGB(50, 120, 50)
		updateStatus("Stopped and restored")
	end
end)

chaosButton.MouseButton1Click:Connect(function()
	chaosOn = not chaosOn
	maxChaosOn = false
	chaosToken += 1
	local myToken = chaosToken

	if chaosOn then
		chaosButton.Text = "CHAOS! : ON"
		chaosButton.BackgroundColor3 = Color3.fromRGB(170, 60, 60)
		maxChaosButton.Text = "MAX CHAOS! : OFF"
		maxChaosButton.BackgroundColor3 = Color3.fromRGB(170, 40, 40)
		updateStatus("Chaos active")

		task.spawn(function()
			while chaosOn and chaosToken == myToken and screenGui.Parent do
				updateCharacter()
				bendSpeed = parseNumber(speedBox.Text, bendSpeed, 0.1, 100)
				bendStrength = parseNumber(strengthBox.Text, bendStrength, 0, 10)
				bendRange = parseNumber(rangeBox.Text, bendRange, 1, 500)

				applyChaosStep(1)
				RunService.RenderStepped:Wait()
			end
		end)
	else
		chaosButton.Text = "CHAOS! : OFF"
		chaosButton.BackgroundColor3 = Color3.fromRGB(150, 90, 40)
		if not bendOn and not maxChaosOn then
			restoreAll()
			updateStatus("Chaos off")
		else
			updateStatus("Chaos off")
		end
	end
end)

maxChaosButton.MouseButton1Click:Connect(function()
	maxChaosOn = not maxChaosOn
	chaosOn = false
	chaosToken += 1
	local myToken = chaosToken

	if maxChaosOn then
		maxChaosButton.Text = "MAX CHAOS! : ON"
		maxChaosButton.BackgroundColor3 = Color3.fromRGB(255, 70, 70)
		chaosButton.Text = "CHAOS! : OFF"
		chaosButton.BackgroundColor3 = Color3.fromRGB(150, 90, 40)
		updateStatus("MAX CHAOS active")

		task.spawn(function()
			while maxChaosOn and chaosToken == myToken and screenGui.Parent do
				updateCharacter()
				bendSpeed = parseNumber(speedBox.Text, bendSpeed, 0.1, 100)
				bendStrength = parseNumber(strengthBox.Text, bendStrength, 0, 10)
				bendRange = parseNumber(rangeBox.Text, bendRange, 1, 500)

				applyChaosStep(2)
				RunService.RenderStepped:Wait()
			end
		end)
	else
		maxChaosButton.Text = "MAX CHAOS! : OFF"
		maxChaosButton.BackgroundColor3 = Color3.fromRGB(170, 40, 40)
		if not bendOn and not chaosOn then
			restoreAll()
			updateStatus("MAX CHAOS off")
		else
			updateStatus("MAX CHAOS off")
		end
	end
end)

resetButton.MouseButton1Click:Connect(function()
	restoreAll()
	bendButton.Text = mainButtonText
	bendButton.BackgroundColor3 = Color3.fromRGB(50, 120, 50)
	chaosButton.Text = "CHAOS! : OFF"
	chaosButton.BackgroundColor3 = Color3.fromRGB(150, 90, 40)
	maxChaosButton.Text = "MAX CHAOS! : OFF"
	maxChaosButton.BackgroundColor3 = Color3.fromRGB(170, 40, 40)
	updateStatus("Reset")
end)

hideButton.MouseButton1Click:Connect(function()
	mainFrame.Visible = false
	smallButton.Visible = true
end)

smallButton.MouseButton1Click:Connect(function()
	mainFrame.Visible = true
	smallButton.Visible = false
end)

closeButton.MouseButton1Click:Connect(function()
	restoreAll()
	screenGui:Destroy()
end)

local function makeDraggable(handle, target)
	local dragging = false
	local dragInput
	local dragStart
	local startPos

	handle.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1
			or input.UserInputType == Enum.UserInputType.Touch then
			dragging = true
			dragStart = input.Position
			startPos = target.Position

			input.Changed:Connect(function()
				if input.UserInputState == Enum.UserInputState.End then
					dragging = false
				end
			end)
		end
	end)

	handle.InputChanged:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseMovement
			or input.UserInputType == Enum.UserInputType.Touch then
			dragInput = input
		end
	end)

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

makeDraggable(titleBar, mainFrame)
makeDraggable(smallButton, smallButton)

refreshTexts()
updateStatus("Ready")

Features & Information

-- Reality Bender GUI -- Simple, mobile-friendly visual effect GUI -- Open source, made by Me -- Bend reality, activate chaos, or go full MAX CHAOS! -- Fully customizable: speed, strength, range, axis, and button names -- Reset anytime and restore original parts -- Drag GUI freely on screen

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts