
KeylessUniversal

-- ═══════════════════════════════════════════════════════════
-- 📚 LOAD RAYFIELD LIBRARY
-- ═══════════════════════════════════════════════════════════
local Rayfield = loadstring(game:HttpGet('https://sirius.menu/rayfield'))()
-- ═══════════════════════════════════════════════════════════
-- 🔧 SERVICES
-- ═══════════════════════════════════════════════════════════
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Lighting = game:GetService("Lighting")
local SoundService = game:GetService("SoundService")
local CollectionService = game:GetService("CollectionService")
local HttpService = game:GetService("HttpService")
-- ═══════════════════════════════════════════════════════════
-- 👤 LOCAL PLAYER
-- ═══════════════════════════════════════════════════════════
local Player = Players.LocalPlayer
local Mouse = Player:GetMouse()
local Camera = Workspace.CurrentCamera
-- ═══════════════════════════════════════════════════════════
-- 📊 GLOBAL VARIABLES
-- ═══════════════════════════════════════════════════════════
local SelectedObject = nil
local IsInspecting = false
local AutoUpdate = true
local UpdateInterval = 0.1
local InspectorData = {}
local CopiedData = ""
local HighlightBox = nil
local SelectionEnabled = false
local LastUpdate = 0
-- ═══════════════════════════════════════════════════════════
-- ⚙️ SETTINGS
-- ═══════════════════════════════════════════════════════════
local Settings = {
SelectHotkey = Enum.KeyCode.Q,
InspectHotkey = Enum.KeyCode.E,
ClearHotkey = Enum.KeyCode.X,
AutoRefresh = true,
RefreshRate = 0.3,
ShowHighlight = true,
HighlightColor = Color3.fromRGB(0, 255, 128),
OutlineColor = Color3.fromRGB(255, 255, 255),
DetailLevel = "Maximum",
ShowDistanceRealtime = true,
HighlightFillTransparency = 0.7
}
-- ═══════════════════════════════════════════════════════════
-- 🛠️ UTILITY FUNCTIONS - FORMAT
-- ═══════════════════════════════════════════════════════════
local function SafeCall(func, ...)
local success, result = pcall(func, ...)
if success then return result else return "Error" end
end
local function FormatNumber(num, decimals)
decimals = decimals or 4
if type(num) ~= "number" then return tostring(num) end
if num == math.huge then return "Infinity" end
if num ~= num then return "NaN" end
return string.format("%." .. decimals .. "f", num)
end
local function FormatVector3(vec, decimals)
decimals = decimals or 3
if typeof(vec) ~= "Vector3" then return "N/A" end
local fmt = "%." .. decimals .. "f"
return string.format("X: " .. fmt .. " | Y: " .. fmt .. " | Z: " .. fmt, vec.X, vec.Y, vec.Z)
end
local function FormatVector3Short(vec)
if typeof(vec) ~= "Vector3" then return "N/A" end
return string.format("(%.2f, %.2f, %.2f)", vec.X, vec.Y, vec.Z)
end
local function FormatVector3Code(vec)
if typeof(vec) ~= "Vector3" then return "N/A" end
return string.format("Vector3.new(%.4f, %.4f, %.4f)", vec.X, vec.Y, vec.Z)
end
local function FormatVector2(vec)
if typeof(vec) ~= "Vector2" then return "N/A" end
return string.format("X: %.3f | Y: %.3f", vec.X, vec.Y)
end
local function FormatCFrame(cf)
if typeof(cf) ~= "CFrame" then return "N/A" end
local x, y, z = cf:ToEulerAnglesXYZ()
return string.format("Pos: (%.2f, %.2f, %.2f) | Rot: (%.1f°, %.1f°, %.1f°)",
cf.Position.X, cf.Position.Y, cf.Position.Z,
math.deg(x), math.deg(y), math.deg(z))
end
local function FormatCFrameDetailed(cf)
if typeof(cf) ~= "CFrame" then return "N/A" end
local rx, ry, rz = cf:ToEulerAnglesXYZ()
local ox, oy, oz = cf:ToOrientation()
return {
Position = FormatVector3(cf.Position),
LookVector = FormatVector3(cf.LookVector),
RightVector = FormatVector3(cf.RightVector),
UpVector = FormatVector3(cf.UpVector),
EulerAngles = string.format("X: %.2f° | Y: %.2f° | Z: %.2f°", math.deg(rx), math.deg(ry), math.deg(rz)),
Orientation = string.format("X: %.2f° | Y: %.2f° | Z: %.2f°", math.deg(ox), math.deg(oy), math.deg(oz))
}
end
local function FormatColor3(color)
if typeof(color) ~= "Color3" then return "N/A" end
local r, g, b = math.floor(color.R * 255), math.floor(color.G * 255), math.floor(color.B * 255)
local h, s, v = Color3.toHSV(color)
return string.format("RGB(%d, %d, %d) | Hex: #%02X%02X%02X | HSV(%.0f°, %.0f%%, %.0f%%)",
r, g, b, r, g, b, h * 360, s * 100, v * 100)
end
local function FormatBrickColor(bc)
if typeof(bc) ~= "BrickColor" then return "N/A" end
return string.format("%s (Number: %d)", bc.Name, bc.Number)
end
local function FormatUDim2(udim)
if typeof(udim) ~= "UDim2" then return "N/A" end
return string.format("X: {%.3f, %d} | Y: {%.3f, %d}",
udim.X.Scale, udim.X.Offset, udim.Y.Scale, udim.Y.Offset)
end
local function FormatBoolean(bool)
if type(bool) == "boolean" then
return bool and "✅ TRUE" or "❌ FALSE"
end
return tostring(bool)
end
local function FormatTime(seconds)
if type(seconds) ~= "number" then return "N/A" end
local hours = math.floor(seconds / 3600)
local mins = math.floor((seconds % 3600) / 60)
local secs = math.floor(seconds % 60)
if hours > 0 then
return string.format("%02d:%02d:%02d", hours, mins, secs)
else
return string.format("%02d:%02d", mins, secs)
end
end
local function FormatBytes(bytes)
if type(bytes) ~= "number" then return "N/A" end
if bytes < 1024 then return string.format("%d B", bytes)
elseif bytes < 1024 * 1024 then return string.format("%.2f KB", bytes / 1024)
elseif bytes < 1024 * 1024 * 1024 then return string.format("%.2f MB", bytes / (1024 * 1024))
else return string.format("%.2f GB", bytes / (1024 * 1024 * 1024)) end
end
-- ═══════════════════════════════════════════════════════════
-- 🛠️ UTILITY FUNCTIONS - OBJECT ANALYSIS
-- ═══════════════════════════════════════════════════════════
local function GetObjectType(obj)
if not obj then return "None" end
-- Check for Player
local player = Players:GetPlayerFromCharacter(obj)
if player then return "👤 Player Character" end
-- Detailed type detection
if obj:IsA("Player") then return "👤 Player"
elseif obj:IsA("Model") then
if obj:FindFirstChildOfClass("Humanoid") then
if obj:FindFirstChild("HumanoidRootPart") then
return "🤖 Character/NPC"
else
return "🦴 Humanoid Model"
end
elseif obj.PrimaryPart then
return "📦 Model (with PrimaryPart)"
else
return "📦 Model"
end
elseif obj:IsA("Tool") then return "🔧 Tool/Item"
elseif obj:IsA("MeshPart") then return "🔷 MeshPart"
elseif obj:IsA("UnionOperation") then return "🔶 Union"
elseif obj:IsA("Part") then
if obj.Shape == Enum.PartType.Ball then return "⚽ Sphere Part"
elseif obj.Shape == Enum.PartType.Cylinder then return "🛢️ Cylinder Part"
elseif obj.Shape == Enum.PartType.Block then return "🧱 Block Part"
else return "📐 Part" end
elseif obj:IsA("WedgePart") then return "📐 Wedge Part"
elseif obj:IsA("CornerWedgePart") then return "📐 Corner Wedge"
elseif obj:IsA("TrussPart") then return "🪜 Truss Part"
elseif obj:IsA("SpawnLocation") then return "🏁 Spawn Location"
elseif obj:IsA("Seat") then return "🪑 Seat"
elseif obj:IsA("VehicleSeat") then return "🚗 Vehicle Seat"
elseif obj:IsA("Accessory") then return "👒 Accessory"
elseif obj:IsA("Decal") then return "🖼️ Decal"
elseif obj:IsA("Texture") then return "🎨 Texture"
elseif obj:IsA("SurfaceGui") then return "📺 Surface GUI"
elseif obj:IsA("BillboardGui") then return "📋 Billboard GUI"
elseif obj:IsA("ScreenGui") then return "🖥️ Screen GUI"
elseif obj:IsA("ParticleEmitter") then return "✨ Particle Emitter"
elseif obj:IsA("Trail") then return "🌈 Trail"
elseif obj:IsA("Beam") then return "⚡ Beam"
elseif obj:IsA("PointLight") then return "💡 Point Light"
elseif obj:IsA("SpotLight") then return "🔦 Spot Light"
elseif obj:IsA("SurfaceLight") then return "🌟 Surface Light"
elseif obj:IsA("Sound") then return "🔊 Sound"
elseif obj:IsA("Script") then return "📜 Script"
elseif obj:IsA("LocalScript") then return "📜 LocalScript"
elseif obj:IsA("ModuleScript") then return "📜 ModuleScript"
elseif obj:IsA("Attachment") then return "📎 Attachment"
elseif obj:IsA("Motor6D") then return "⚙️ Motor6D"
elseif obj:IsA("Weld") then return "🔗 Weld"
elseif obj:IsA("WeldConstraint") then return "🔗 WeldConstraint"
elseif obj:IsA("Folder") then return "📁 Folder"
elseif obj:IsA("Camera") then return "📷 Camera"
elseif obj:IsA("Terrain") then return "🏔️ Terrain"
elseif obj:IsA("Humanoid") then return "🏃 Humanoid"
elseif obj:IsA("ClickDetector") then return "🖱️ ClickDetector"
elseif obj:IsA("ProximityPrompt") then return "💬 ProximityPrompt"
elseif obj:IsA("Fire") then return "🔥 Fire"
elseif obj:IsA("Smoke") then return "💨 Smoke"
elseif obj:IsA("Sparkles") then return "✨ Sparkles"
elseif obj:IsA("Explosion") then return "💥 Explosion"
elseif obj:IsA("ForceField") then return "🛡️ ForceField"
elseif obj:IsA("ValueBase") then return "📊 Value (" .. obj.ClassName .. ")"
elseif obj:IsA("RemoteEvent") then return "📡 RemoteEvent"
elseif obj:IsA("RemoteFunction") then return "📡 RemoteFunction"
elseif obj:IsA("BindableEvent") then return "🔔 BindableEvent"
elseif obj:IsA("BindableFunction") then return "🔔 BindableFunction"
else return "📄 " .. obj.ClassName
end
end
local function GetDistance(obj)
if not Player.Character or not Player.Character:FindFirstChild("HumanoidRootPart") then
return "N/A", 0
end
local playerPos = Player.Character.HumanoidRootPart.Position
local objPos
if obj:IsA("BasePart") then
objPos = obj.Position
elseif obj:IsA("Model") and obj.PrimaryPart then
objPos = obj.PrimaryPart.Position
elseif obj:IsA("Model") then
local success, cf, size = pcall(function() return obj:GetBoundingBox() end)
if success then objPos = cf.Position else return "N/A", 0 end
elseif obj:IsA("Attachment") then
objPos = obj.WorldPosition
else
return "N/A", 0
end
local dist = (playerPos - objPos).Magnitude
return string.format("%.2f studs (%.2f meters)", dist, dist * 0.28), dist
end
local function GetDirectionTo(obj)
if not Player.Character or not Player.Character:FindFirstChild("HumanoidRootPart") then
return "N/A"
end
local playerPos = Player.Character.HumanoidRootPart.Position
local objPos
if obj:IsA("BasePart") then
objPos = obj.Position
elseif obj:IsA("Model") then
local success, cf = pcall(function() return obj:GetBoundingBox() end)
if success then objPos = cf.Position else return "N/A" end
else
return "N/A"
end
local direction = (objPos - playerPos).Unit
local angle = math.deg(math.atan2(direction.X, direction.Z))
local compass = ""
if angle >= -22.5 and angle < 22.5 then compass = "North"
elseif angle >= 22.5 and angle < 67.5 then compass = "North-East"
elseif angle >= 67.5 and angle < 112.5 then compass = "East"
elseif angle >= 112.5 and angle < 157.5 then compass = "South-East"
elseif angle >= 157.5 or angle < -157.5 then compass = "South"
elseif angle >= -157.5 and angle < -112.5 then compass = "South-West"
elseif angle >= -112.5 and angle < -67.5 then compass = "West"
else compass = "North-West" end
local vertDir = ""
if direction.Y > 0.3 then vertDir = " (Above)"
elseif direction.Y < -0.3 then vertDir = " (Below)"
end
return string.format("%s%s (%.1f°)", compass, vertDir, angle)
end
local function CountChildren(obj, deep)
if deep then
return #obj:GetDescendants()
else
return #obj:GetChildren()
end
end
local function GetHierarchyDepth(obj)
local depth = 0
local current = obj
while current.Parent do
depth = depth + 1
current = current.Parent
end
return depth
end
local function EstimateMemory(obj)
local baseSize = 100
local descendants = obj:GetDescendants()
local total = baseSize
for _, child in pairs(descendants) do
total = total + 50
if child:IsA("BasePart") then total = total + 200 end
if child:IsA("MeshPart") then total = total + 500 end
if child:IsA("UnionOperation") then total = total + 800 end
if child:IsA("Texture") or child:IsA("Decal") then total = total + 300 end
if child:IsA("Sound") then total = total + 200 end
if child:IsA("ParticleEmitter") then total = total + 150 end
if child:IsA("Script") or child:IsA("LocalScript") then total = total + 100 end
end
return FormatBytes(total)
end
local function GetNetworkOwner(obj)
if not obj:IsA("BasePart") then return "N/A" end
local success, owner = pcall(function()
return obj:GetNetworkOwner()
end)
if success then
if owner then
return owner.Name .. " (Player)"
else
return "Server"
end
else
return "Cannot determine"
end
end
local function GetAttributes(obj)
local attrs = obj:GetAttributes()
if next(attrs) == nil then return {} end
local result = {}
for name, value in pairs(attrs) do
table.insert(result, {
Name = name,
Value = tostring(value),
Type = typeof(value)
})
end
return result
end
local function GetTags(obj)
return CollectionService:GetTags(obj)
end
local function GetChildrenByClass(obj)
local classes = {}
for _, child in pairs(obj:GetChildren()) do
local className = child.ClassName
classes[className] = (classes[className] or 0) + 1
end
return classes
end
-- ═══════════════════════════════════════════════════════════
-- ✨ HIGHLIGHT SYSTEM
-- ═══════════════════════════════════════════════════════════
local function CreateHighlight(obj)
if HighlightBox then
HighlightBox:Destroy()
HighlightBox = nil
end
if not Settings.ShowHighlight then return end
if not obj then return end
local highlight = Instance.new("Highlight")
highlight.Name = "InspectorHighlight_" .. obj.Name
highlight.FillColor = Settings.HighlightColor
highlight.OutlineColor = Settings.OutlineColor
highlight.FillTransparency = Settings.HighlightFillTransparency
highlight.OutlineTransparency = 0
highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
if obj:IsA("BasePart") or obj:IsA("Model") then
highlight.Adornee = obj
highlight.Parent = Player.PlayerGui
HighlightBox = highlight
end
end
local function RemoveHighlight()
if HighlightBox then
HighlightBox:Destroy()
HighlightBox = nil
end
end
local function UpdateHighlight()
if HighlightBox and Settings.ShowHighlight then
HighlightBox.FillColor = Settings.HighlightColor
HighlightBox.OutlineColor = Settings.OutlineColor
HighlightBox.FillTransparency = Settings.HighlightFillTransparency
end
end
-- ═══════════════════════════════════════════════════════════
-- 🖥️ CREATE RAYFIELD WINDOW
-- ═══════════════════════════════════════════════════════════
local Window = Rayfield:CreateWindow({
Name = "🔍 ULTIMATE OBJECT INSPECTOR v2.0",
LoadingTitle = "Loading Inspector...",
LoadingSubtitle = "Cực Chi Tiết Edition",
ConfigurationSaving = {
Enabled = false,
FolderName = nil,
FileName = "InspectorConfig"
},
Discord = {
Enabled = false
},
KeySystem = false
})
-- ═══════════════════════════════════════════════════════════
-- 📑 CREATE TABS
-- ═══════════════════════════════════════════════════════════
local MainTab = Window:CreateTab("🔍 Inspector", 4483362458)
local PlayerTab = Window:CreateTab("👤 Player Info", 4483362458)
local WorldTab = Window:CreateTab("🌍 World Info", 4483362458)
local SettingsTab = Window:CreateTab("⚙️ Settings", 4483362458)
local HelpTab = Window:CreateTab("❓ Help", 4483362458)
-- ═══════════════════════════════════════════════════════════
-- 🎯 MAIN TAB - SELECTION SECTION
-- ═══════════════════════════════════════════════════════════
local SelectionSection = MainTab:CreateSection("🎯 Object Selection")
local SelectionModeLabel = MainTab:CreateLabel("📌 Selection Mode: OFF")
MainTab:CreateButton({
Name = "🔘 Toggle Selection Mode (or press Q)",
Callback = function()
SelectionEnabled = not SelectionEnabled
SelectionModeLabel:Set("📌 Selection Mode: " .. (SelectionEnabled and "✅ ON" or "❌ OFF"))
Rayfield:Notify({
Title = SelectionEnabled and "Selection Enabled" or "Selection Disabled",
Content = SelectionEnabled and "Press Q or click to select objects!" or "Selection mode turned off",
Duration = 2
})
end,
})
local CurrentSelectionLabel = MainTab:CreateLabel("📦 Selected: None")
local ObjectTypeLabel = MainTab:CreateLabel("📁 Type: N/A")
local DistanceLabel = MainTab:CreateLabel("📏 Distance: N/A")
local DirectionLabel = MainTab:CreateLabel("🧭 Direction: N/A")
MainTab:CreateButton({
Name = "🎯 Select Object Under Mouse (Q)",
Callback = function()
local target = Mouse.Target
if target then
SelectedObject = target
CreateHighlight(target)
CurrentSelectionLabel:Set("📦 Selected: " .. target.Name)
ObjectTypeLabel:Set("📁 Type: " .. GetObjectType(target))
local dist = GetDistance(target)
DistanceLabel:Set("📏 Distance: " .. dist)
DirectionLabel:Set("🧭 Direction: " .. GetDirectionTo(target))
Rayfield:Notify({
Title = "✅ Object Selected",
Content = target.Name .. " (" .. target.ClassName .. ")",
Duration = 2
})
else
Rayfield:Notify({
Title = "⚠️ No Object",
Content = "Point your mouse at an object!",
Duration = 2
})
end
end,
})
MainTab:CreateButton({
Name = "🔼 Select Parent of Current",
Callback = function()
if SelectedObject and SelectedObject.Parent then
SelectedObject = SelectedObject.Parent
CreateHighlight(SelectedObject)
CurrentSelectionLabel:Set("📦 Selected: " .. SelectedObject.Name)
Rayfield:Notify({
Title = "Selected Parent",
Content = SelectedObject.Name,
Duration = 2
})
end
end,
})
MainTab:CreateButton({
Name = "👤 Select Nearest Player",
Callback = function()
local nearestPlayer = nil
local nearestDist = math.huge
local myPos = Player.Character and Player.Character:FindFirstChild("HumanoidRootPart") and Player.Character.HumanoidRootPart.Position
if not myPos then
Rayfield:Notify({Title = "❌ Error", Content = "Your character not found!", Duration = 2})
return
end
for _, plr in pairs(Players:GetPlayers()) do
if plr ~= Player and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then
local dist = (plr.Character.HumanoidRootPart.Position - myPos).Magnitude
if dist < nearestDist then
nearestDist = dist
nearestPlayer = plr
end
end
end
if nearestPlayer and nearestPlayer.Character then
SelectedObject = nearestPlayer.Character
CreateHighlight(nearestPlayer.Character)
CurrentSelectionLabel:Set("📦 Selected: " .. nearestPlayer.Name .. "'s Character")
ObjectTypeLabel:Set("📁 Type: 👤 Player Character")
DistanceLabel:Set("📏 Distance: " .. string.format("%.2f studs", nearestDist))
Rayfield:Notify({
Title = "✅ Player Selected",
Content = nearestPlayer.Name .. " - " .. string.format("%.1f", nearestDist) .. " studs away",
Duration = 2
})
else
Rayfield:Notify({Title = "⚠️ No Players", Content = "No other players found!", Duration = 2})
end
end,
})
MainTab:CreateButton({
Name = "📦 Select Nearest Dropped Item",
Callback = function()
local nearestItem = nil
local nearestDist = math.huge
local myPos = Player.Character and Player.Character:FindFirstChild("HumanoidRootPart") and Player.Character.HumanoidRootPart.Position
if not myPos then
Rayfield:Notify({Title = "❌ Error", Content = "Your character not found!", Duration = 2})
return
end
-- Search common item locations
local searchLocations = {
Workspace,
Workspace:FindFirstChild("Drops"),
Workspace:FindFirstChild("Items"),
Workspace:FindFirstChild("DroppedItems"),
Workspace:FindFirstChild("Loot"),
Workspace:FindFirstChild("GroundItems"),
}
for _, location in pairs(searchLocations) do
if location then
for _, item in pairs(location:GetDescendants()) do
if item:IsA("Tool") or (item:IsA("Model") and item:FindFirstChild("Handle")) then
local pos
if item:IsA("Tool") and item:FindFirstChild("Handle") then
pos = item.Handle.Position
elseif item:IsA("Model") and item.PrimaryPart then
pos = item.PrimaryPart.Position
elseif item:IsA("Model") then
local success, cf = pcall(function() return item:GetBoundingBox() end)
if success then pos = cf.Position end
end
if pos then
local dist = (pos - myPos).Magnitude
if dist < nearestDist then
nearestDist = dist
nearestItem = item
end
end
end
end
end
end
if nearestItem then
SelectedObject = nearestItem
CreateHighlight(nearestItem)
CurrentSelectionLabel:Set("📦 Selected: " .. nearestItem.Name)
Rayfield:Notify({
Title = "✅ Item Selected",
Content = nearestItem.Name .. " - " .. string.format("%.1f", nearestDist) .. " studs away",
Duration = 2
})
else
Rayfield:Notify({Title = "⚠️ No Items", Content = "No dropped items found!", Duration = 2})
end
end,
})
MainTab:CreateButton({
Name = "❌ Clear Selection",
Callback = function()
SelectedObject = nil
RemoveHighlight()
CurrentSelectionLabel:Set("📦 Selected: None")
ObjectTypeLabel:Set("📁 Type: N/A")
DistanceLabel:Set("📏 Distance: N/A")
DirectionLabel:Set("🧭 Direction: N/A")
Rayfield:Notify({Title = "🗑️ Cleared", Content = "Selection cleared!", Duration = 1.5})
end,
})
-- ═══════════════════════════════════════════════════════════
-- 📋 MAIN TAB - BASIC INFO SECTION
-- ═══════════════════════════════════════════════════════════
local BasicSection = MainTab:CreateSection("📋 Basic Information")
local NameLabel = MainTab:CreateLabel("Name: N/A")
local ClassLabel = MainTab:CreateLabel("ClassName: N/A")
local FullPathLabel = MainTab:CreateLabel("Path: N/A")
local ParentLabel = MainTab:CreateLabel("Parent: N/A")
local ChildrenLabel = MainTab:CreateLabel("Children: N/A")
local DescendantsLabel = MainTab:CreateLabel("Descendants: N/A")
local MemoryLabel = MainTab:CreateLabel("Est. Memory: N/A")
local DepthLabel = MainTab:CreateLabel("Hierarchy Depth: N/A")
-- ═══════════════════════════════════════════════════════════
-- 📐 MAIN TAB - TRANSFORM SECTION
-- ═══════════════════════════════════════════════════════════
local TransformSection = MainTab:CreateSection("📐 Transform & Position")
local PositionLabel = MainTab:CreateLabel("Position: N/A")
local RotationLabel = MainTab:CreateLabel("Rotation: N/A")
local OrientationLabel = MainTab:CreateLabel("Orientation: N/A")
local SizeLabel = MainTab:CreateLabel("Size: N/A")
local VolumeLabel = MainTab:CreateLabel("Volume: N/A")
local LookVectorLabel = MainTab:CreateLabel("LookVector: N/A")
local UpVectorLabel = MainTab:CreateLabel("UpVector: N/A")
local RightVectorLabel = MainTab:CreateLabel("RightVector: N/A")
local PivotLabel = MainTab:CreateLabel("Pivot Offset: N/A")
-- ═══════════════════════════════════════════════════════════
-- ⚡ MAIN TAB - PHYSICS SECTION
-- ═══════════════════════════════════════════════════════════
local PhysicsSection = MainTab:CreateSection("⚡ Physics Properties")
local AnchoredLabel = MainTab:CreateLabel("Anchored: N/A")
local CanCollideLabel = MainTab:CreateLabel("CanCollide: N/A")
local CanTouchLabel = MainTab:CreateLabel("CanTouch: N/A")
local CanQueryLabel = MainTab:CreateLabel("CanQuery: N/A")
local MassLabel = MainTab:CreateLabel("Mass: N/A")
local DensityLabel = MainTab:CreateLabel("Density: N/A")
local VelocityLabel = MainTab:CreateLabel("Velocity: N/A")
local AngularVelocityLabel = MainTab:CreateLabel("Angular Velocity: N/A")
local RootPartLabel = MainTab:CreateLabel("RootPart: N/A")
local CollisionGroupLabel = MainTab:CreateLabel("Collision Group: N/A")
local NetworkOwnerLabel = MainTab:CreateLabel("Network Owner: N/A")
-- ═══════════════════════════════════════════════════════════
-- 🎨 MAIN TAB - APPEARANCE SECTION
-- ═══════════════════════════════════════════════════════════
local AppearanceSection = MainTab:CreateSection("🎨 Appearance")
local ColorLabel = MainTab:CreateLabel("Color: N/A")
local BrickColorLabel = MainTab:CreateLabel("BrickColor: N/A")
local MaterialLabel = MainTab:CreateLabel("Material: N/A")
local MaterialVariantLabel = MainTab:CreateLabel("Material Variant: N/A")
local TransparencyLabel = MainTab:CreateLabel("Transparency: N/A")
local ReflectanceLabel = MainTab:CreateLabel("Reflectance: N/A")
local CastShadowLabel = MainTab:CreateLabel("CastShadow: N/A")
local SurfaceTypesLabel = MainTab:CreateLabel("Surface Types: N/A")
-- ═══════════════════════════════════════════════════════════
-- 🤖 MAIN TAB - HUMANOID SECTION
-- ═══════════════════════════════════════════════════════════
local HumanoidSection = MainTab:CreateSection("🤖 Humanoid Properties")
local HealthLabel = MainTab:CreateLabel("Health: N/A")
local MaxHealthLabel = MainTab:CreateLabel("MaxHealth: N/A")
local WalkSpeedLabel = MainTab:CreateLabel("WalkSpeed: N/A")
local JumpPowerLabel = MainTab:CreateLabel("JumpPower: N/A")
local JumpHeightLabel = MainTab:CreateLabel("JumpHeight: N/A")
local HipHeightLabel = MainTab:CreateLabel("HipHeight: N/A")
local StateLabel = MainTab:CreateLabel("State: N/A")
local SitLabel = MainTab:CreateLabel("Sit: N/A")
local DisplayNameLabel = MainTab:CreateLabel("DisplayName: N/A")
local RigTypeLabel = MainTab:CreateLabel("RigType: N/A")
-- ═══════════════════════════════════════════════════════════
-- 📊 MAIN TAB - ATTRIBUTES SECTION
-- ═══════════════════════════════════════════════════════════
local AttributesSection = MainTab:CreateSection("📊 Attributes & Tags")
local AttributesLabel = MainTab:CreateLabel("Attributes: N/A")
local TagsLabel = MainTab:CreateLabel("Tags: N/A")
-- ═══════════════════════════════════════════════════════════
-- 🌳 MAIN TAB - HIERARCHY SECTION
-- ═══════════════════════════════════════════════════════════
local HierarchySection = MainTab:CreateSection("🌳 Hierarchy & Classes")
local ChildClassesLabel = MainTab:CreateLabel("Child Classes: N/A")
-- ═══════════════════════════════════════════════════════════
-- 📋 MAIN TAB - COPY SECTION
-- ═══════════════════════════════════════════════════════════
local CopySection = MainTab:CreateSection("📋 Copy Data")
MainTab:CreateButton({
Name = "📋 Copy ALL Data (Full Report)",
Callback = function()
if CopiedData ~= "" then
setclipboard(CopiedData)
Rayfield:Notify({
Title = "✅ Copied!",
Content = "Full inspector report copied to clipboard!",
Duration = 2
})
else
Rayfield:Notify({
Title = "⚠️ No Data",
Content = "Select an object first!",
Duration = 2
})
end
end,
})
MainTab:CreateButton({
Name = "📍 Copy Position (Vector3)",
Callback = function()
if SelectedObject and SelectedObject:IsA("BasePart") then
local pos = SelectedObject.Position
setclipboard(FormatVector3Code(pos))
Rayfield:Notify({Title = "✅ Copied!", Content = "Position: " .. FormatVector3Short(pos), Duration = 2})
elseif SelectedObject and SelectedObject:IsA("Model") then
local success, cf = pcall(function() return SelectedObject:GetBoundingBox() end)
if success then
setclipboard(FormatVector3Code(cf.Position))
Rayfield:Notify({Title = "✅ Copied!", Content = "Model position copied!", Duration = 2})
end
else
Rayfield:Notify({Title = "⚠️ Error", Content = "No valid object selected!", Duration = 2})
end
end,
})
MainTab:CreateButton({
Name = "📐 Copy CFrame (Full)",
Callback = function()
if SelectedObject and SelectedObject:IsA("BasePart") then
local cf = SelectedObject.CFrame
local x, y, z = cf:ToEulerAnglesXYZ()
local code = string.format("CFrame.new(%.4f, %.4f, %.4f) * CFrame.Angles(%.4f, %.4f, %.4f)",
cf.Position.X, cf.Position.Y, cf.Position.Z, x, y, z)
setclipboard(code)
Rayfield:Notify({Title = "✅ Copied!", Content = "Full CFrame copied!", Duration = 2})
else
Rayfield:Notify({Title = "⚠️ Error", Content = "Select a BasePart!", Duration = 2})
end
end,
})
MainTab:CreateButton({
Name = "🔗 Copy Full Path",
Callback = function()
if SelectedObject then
local path = SelectedObject:GetFullName()
setclipboard('game.' .. path)
Rayfield:Notify({Title = "✅ Copied!", Content = "Full path copied!", Duration = 2})
else
Rayfield:Notify({Title = "⚠️ Error", Content = "No object selected!", Duration = 2})
end
end,
})
MainTab:CreateButton({
Name = "🎨 Copy Color (Color3)",
Callback = function()
if SelectedObject and SelectedObject:IsA("BasePart") then
local c = SelectedObject.Color
setclipboard(string.format("Color3.new(%.4f, %.4f, %.4f)", c.R, c.G, c.B))
Rayfield:Notify({Title = "✅ Copied!", Content = "Color copied!", Duration = 2})
else
Rayfield:Notify({Title = "⚠️ Error", Content = "Select a BasePart!", Duration = 2})
end
end,
})
MainTab:CreateButton({
Name = "📦 Copy Size (Vector3)",
Callback = function()
if SelectedObject and SelectedObject:IsA("BasePart") then
setclipboard(FormatVector3Code(SelectedObject.Size))
Rayfield:Notify({Title = "✅ Copied!", Content = "Size copied!", Duration = 2})
else
Rayfield:Notify({Title = "⚠️ Error", Content = "Select a BasePart!", Duration = 2})
end
end,
})
MainTab:CreateButton({
Name = "📊 Copy All Attributes (JSON)",
Callback = function()
if SelectedObject then
local attrs = SelectedObject:GetAttributes()
if next(attrs) then
local json = HttpService:JSONEncode(attrs)
setclipboard(json)
Rayfield:Notify({Title = "✅ Copied!", Content = "Attributes copied as JSON!", Duration = 2})
else
Rayfield:Notify({Title = "⚠️ No Attributes", Content = "This object has no attributes!", Duration = 2})
end
else
Rayfield:Notify({Title = "⚠️ Error", Content = "No object selected!", Duration = 2})
end
end,
})
-- ═══════════════════════════════════════════════════════════
-- 👤 PLAYER TAB
-- ═══════════════════════════════════════════════════════════
local LocalPlayerSection = PlayerTab:CreateSection("👤 Local Player Info")
local PNameLabel = PlayerTab:CreateLabel("Name: " .. Player.Name)
local PDisplayLabel = PlayerTab:CreateLabel("DisplayName: " .. Player.DisplayName)
local PIdLabel = PlayerTab:CreateLabel("UserId: " .. Player.UserId)
local PAgeLabel = PlayerTab:CreateLabel("Account Age: " .. Player.AccountAge .. " days")
local PTeamLabel = PlayerTab:CreateLabel("Team: " .. (Player.Team and Player.Team.Name or "None"))
local PMembershipLabel = PlayerTab:CreateLabel("Membership: " .. tostring(Player.MembershipType))
local PFollowLabel = PlayerTab:CreateLabel("FollowUserId: " .. (Player.FollowUserId > 0 and tostring(Player.FollowUserId) or "None"))
local CharSection = PlayerTab:CreateSection("🏃 Character Info")
local CharPosLabel = PlayerTab:CreateLabel("Position: N/A")
local CharVelocityLabel = PlayerTab:CreateLabel("Velocity: N/A")
local CharSpeedLabel = PlayerTab:CreateLabel("Current Speed: N/A")
local CharHealthLabel = PlayerTab:CreateLabel("Health: N/A")
local CharWalkLabel = PlayerTab:CreateLabel("WalkSpeed: N/A")
local CharJumpLabel = PlayerTab:CreateLabel("JumpPower: N/A")
local CharLookLabel = PlayerTab:CreateLabel("Look Direction: N/A")
local CharMoveLabel = PlayerTab:CreateLabel("Move Direction: N/A")
local CharStateLabel = PlayerTab:CreateLabel("State: N/A")
local CharFloorLabel = PlayerTab:CreateLabel("Floor Material: N/A")
local CamSection = PlayerTab:CreateSection("📷 Camera Info")
local CamPosLabel = PlayerTab:CreateLabel("Position: N/A")
local CamLookLabel = PlayerTab:CreateLabel("Look Vector: N/A")
local CamFOVLabel = PlayerTab:CreateLabel("FOV: N/A")
local CamTypeLabel = PlayerTab:CreateLabel("Type: N/A")
local CamFocusLabel = PlayerTab:CreateLabel("Focus: N/A")
local CamSubjectLabel = PlayerTab:CreateLabel("Subject: N/A")
local CamDistLabel = PlayerTab:CreateLabel("View Distance: N/A")
local ToolsSection = PlayerTab:CreateSection("🔧 Equipped Tools")
local EquippedToolLabel = PlayerTab:CreateLabel("Equipped: None")
local BackpackLabel = PlayerTab:CreateLabel("Backpack: Loading...")
PlayerTab:CreateButton({
Name = "📋 Copy Character Position",
Callback = function()
if Player.Character and Player.Character:FindFirstChild("HumanoidRootPart") then
local pos = Player.Character.HumanoidRootPart.Position
setclipboard(FormatVector3Code(pos))
Rayfield:Notify({Title = "✅ Copied!", Content = "Your position copied!", Duration = 2})
end
end,
})
PlayerTab:CreateButton({
Name = "📋 Copy Camera CFrame",
Callback = function()
local cf = Camera.CFrame
local code = string.format("CFrame.new(%.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f)",
cf.Position.X, cf.Position.Y, cf.Position.Z,
cf:GetComponents())
setclipboard(code)
Rayfield:Notify({Title = "✅ Copied!", Content = "Camera CFrame copied!", Duration = 2})
end,
})
-- ═══════════════════════════════════════════════════════════
-- 🌍 WORLD TAB
-- ═══════════════════════════════════════════════════════════
local GameSection = WorldTab:CreateSection("🎮 Game Info")
local GameIdLabel = WorldTab:CreateLabel("PlaceId: " .. game.PlaceId)
local GameVersionLabel = WorldTab:CreateLabel("PlaceVersion: " .. game.PlaceVersion)
local JobIdLabel = WorldTab:CreateLabel("JobId: " .. game.JobId)
local CreatorLabel = WorldTab:CreateLabel("Creator: " .. (game.CreatorType == Enum.CreatorType.User and "User" or "Group") .. " #" .. game.CreatorId)
local ServerSection = WorldTab:CreateSection("🖥️ Server Info")
local PlayerCountLabel = WorldTab:CreateLabel("Players: " .. #Players:GetPlayers() .. "/" .. Players.MaxPlayers)
local ServerTimeLabel = WorldTab:CreateLabel("Server Time: N/A")
local ServerAgeLabel = WorldTab:CreateLabel("Server Uptime: N/A")
local EnvironmentSection = WorldTab:CreateSection("🌅 Environment")
local LightingTimeLabel = WorldTab:CreateLabel("Time of Day: " .. Lighting.TimeOfDay)
local AmbientLabel = WorldTab:CreateLabel("Ambient: " .. FormatColor3(Lighting.Ambient))
local BrightnessLabel = WorldTab:CreateLabel("Brightness: " .. Lighting.Brightness)
local FogLabel = WorldTab:CreateLabel("Fog: " .. Lighting.FogStart .. " - " .. Lighting.FogEnd)
local GravityLabel = WorldTab:CreateLabel("Gravity: " .. Workspace.Gravity)
WorldTab:CreateButton({
Name = "📋 Copy Game Info",
Callback = function()
local info = string.format([[
Game Info:
PlaceId: %d
PlaceVersion: %d
JobId: %s
CreatorId: %d
Players: %d/%d
]], game.PlaceId, game.PlaceVersion, game.JobId, game.CreatorId, #Players:GetPlayers(), Players.MaxPlayers)
setclipboard(info)
Rayfield:Notify({Title = "✅ Copied!", Content = "Game info copied!", Duration = 2})
end,
})
-- ═══════════════════════════════════════════════════════════
-- ⚙️ SETTINGS TAB
-- ═══════════════════════════════════════════════════════════
local InspectorSettingsSection = SettingsTab:CreateSection("⚙️ Inspector Settings")
SettingsTab:CreateToggle({
Name = "🔄 Auto Refresh Data",
CurrentValue = Settings.AutoRefresh,
Flag = "AutoRefresh",
Callback = function(Value)
Settings.AutoRefresh = Value
end,
})
SettingsTab:CreateSlider({
Name = "⏱️ Refresh Rate",
Range = {0.1, 3},
Increment = 0.1,
Suffix = " seconds",
CurrentValue = Settings.RefreshRate,
Flag = "RefreshRate",
Callback = function(Value)
Settings.RefreshRate = Value
end,
})
local HighlightSettingsSection = SettingsTab:CreateSection("✨ Highlight Settings")
SettingsTab:CreateToggle({
Name = "✨ Show Selection Highlight",
CurrentValue = Settings.ShowHighlight,
Flag = "ShowHighlight",
Callback = function(Value)
Settings.ShowHighlight = Value
if not Value then
RemoveHighlight()
elseif SelectedObject then
CreateHighlight(SelectedObject)
end
end,
})
SettingsTab:CreateColorPicker({
Name = "🎨 Highlight Fill Color",
Color = Settings.HighlightColor,
Flag = "HighlightColor",
Callback = function(Value)
Settings.HighlightColor = Value
UpdateHighlight()
end
})
SettingsTab:CreateColorPicker({
Name = "⬜ Highlight Outline Color",
Color = Settings.OutlineColor,
Flag = "OutlineColor",
Callback = function(Value)
Settings.OutlineColor = Value
UpdateHighlight()
end
})
SettingsTab:CreateSlider({
Name = "👁️ Highlight Transparency",
Range = {0, 1},
Increment = 0.05,
Suffix = "",
CurrentValue = Settings.HighlightFillTransparency,
Flag = "HighlightTransparency",
Callback = function(Value)
Settings.HighlightFillTransparency = Value
UpdateHighlight()
end,
})
local HotkeySettingsSection = SettingsTab:CreateSection("⌨️ Hotkey Settings")
SettingsTab:CreateKeybind({
Name = "🎯 Quick Select Hotkey",
CurrentKeybind = "Q",
HoldToInteract = false,
Flag = "SelectKey",
Callback = function(Keybind)
if SelectionEnabled and Mouse.Target then
SelectedObject = Mouse.Target
CreateHighlight(Mouse.Target)
CurrentSelectionLabel:Set("📦 Selected: " .. Mouse.Target.Name)
ObjectTypeLabel:Set("📁 Type: " .. GetObjectType(Mouse.Target))
Rayfield:Notify({
Title = "⚡ Quick Select",
Content = Mouse.Target.Name,
Duration = 1.5
})
end
end,
})
local DetailSettingsSection = SettingsTab:CreateSection("📊 Detail Level")
SettingsTab:CreateDropdown({
Name = "📊 Information Detail Level",
Options = {"Basic", "Detailed", "Maximum"},
CurrentOption = {Settings.DetailLevel},
MultipleOptions = false,
Flag = "DetailLevel",
Callback = function(Options)
Settings.DetailLevel = Options[1]
end,
})
-- ═══════════════════════════════════════════════════════════
-- ❓ HELP TAB
-- ═══════════════════════════════════════════════════════════
local UsageSection = HelpTab:CreateSection("📖 How to Use")
HelpTab:CreateLabel("1️⃣ Click 'Toggle Selection Mode' or press Q")
HelpTab:CreateLabel("2️⃣ Point mouse at any object")
HelpTab:CreateLabel("3️⃣ Press Q or click 'Select Object Under Mouse'")
HelpTab:CreateLabel("4️⃣ View all details in Inspector tab")
HelpTab:CreateLabel("5️⃣ Use Copy buttons to copy any data")
local HotkeyHelpSection = HelpTab:CreateSection("⌨️ Default Hotkeys")
HelpTab:CreateLabel("Q - Quick select object under cursor")
HelpTab:CreateLabel("RightShift - Toggle GUI visibility")
local InfoTypesSection = HelpTab:CreateSection("ℹ️ Available Information")
HelpTab:CreateLabel("📋 Basic: Name, Class, Path, Children")
HelpTab:CreateLabel("📐 Transform: Position, Rotation, Size, Vectors")
HelpTab:CreateLabel("⚡ Physics: Mass, Velocity, Anchored, Collision")
HelpTab:CreateLabel("🎨 Appearance: Color, Material, Transparency")
HelpTab:CreateLabel("🤖 Humanoid: Health, Speed, State, RigType")
HelpTab:CreateLabel("📊 Attributes: Custom attributes & tags")
HelpTab:CreateLabel("🌐 Network: Ownership, Replication status")
local TipsSection = HelpTab:CreateSection("💡 Tips")
HelpTab:CreateLabel("• Use 'Select Parent' to navigate up hierarchy")
HelpTab:CreateLabel("• Enable auto-refresh for real-time updates")
HelpTab:CreateLabel("• Copy data to use in your own scripts")
HelpTab:CreateLabel("• Adjust highlight settings for visibility")
-- ═══════════════════════════════════════════════════════════
-- 🔚 END OF PART 1 - PASTE PART 2 BELOW THIS LINE
-- ═══════════════════════════════════════════════════════════
print("✅ [INSPECTOR] Part 1 loaded successfully!")
print("📋 Waiting for Part 2...")
-- ═══════════════════════════════════════════════════════════
-- 🔍 ULTIMATE OBJECT INSPECTOR - PHẦN 2/2
-- ═══════════════════════════════════════════════════════════
-- Paste trực tiếp sau Phần 1
-- ═══════════════════════════════════════════════════════════
print("📋 [INSPECTOR] Loading Part 2...")
-- ═══════════════════════════════════════════════════════════
-- 🔍 DETAILED INSPECTION FUNCTIONS
-- ═══════════════════════════════════════════════════════════
local function InspectBasePart(obj)
local data = {}
-- Basic Info
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.Children = CountChildren(obj, false)
data.Descendants = CountChildren(obj, true)
data.HierarchyDepth = GetHierarchyDepth(obj)
data.EstimatedMemory = EstimateMemory(obj)
-- Transform
data.Position = FormatVector3(obj.Position)
data.PositionCode = FormatVector3Code(obj.Position)
data.CFrame = FormatCFrame(obj.CFrame)
data.CFrameDetailed = FormatCFrameDetailed(obj.CFrame)
data.Orientation = FormatVector3(obj.Orientation)
data.Rotation = FormatVector3(obj.Rotation)
data.Size = FormatVector3(obj.Size)
data.SizeCode = FormatVector3Code(obj.Size)
data.Volume = FormatNumber(obj.Size.X * obj.Size.Y * obj.Size.Z, 4) .. " studs³"
data.LookVector = FormatVector3(obj.CFrame.LookVector)
data.UpVector = FormatVector3(obj.CFrame.UpVector)
data.RightVector = FormatVector3(obj.CFrame.RightVector)
data.PivotOffset = FormatCFrame(obj.PivotOffset)
-- Distance & Direction
local distStr, distNum = GetDistance(obj)
data.Distance = distStr
data.DistanceRaw = distNum
data.Direction = GetDirectionTo(obj)
-- Physics
data.Anchored = FormatBoolean(obj.Anchored)
data.CanCollide = FormatBoolean(obj.CanCollide)
data.CanTouch = FormatBoolean(obj.CanTouch)
data.CanQuery = FormatBoolean(obj.CanQuery)
data.Massless = FormatBoolean(obj.Massless)
local success, mass = pcall(function() return obj:GetMass() end)
data.Mass = success and FormatNumber(mass, 4) .. " kg" or "N/A"
data.Density = FormatNumber(obj.CustomPhysicalProperties and obj.CustomPhysicalProperties.Density or "Default")
data.Friction = obj.CustomPhysicalProperties and FormatNumber(obj.CustomPhysicalProperties.Friction) or "Default"
data.Elasticity = obj.CustomPhysicalProperties and FormatNumber(obj.CustomPhysicalProperties.Elasticity) or "Default"
local velocity = obj.AssemblyLinearVelocity
data.Velocity = FormatVector3(velocity)
data.Speed = FormatNumber(velocity.Magnitude, 2) .. " studs/s"
data.AngularVelocity = FormatVector3(obj.AssemblyAngularVelocity)
data.RootPart = obj.AssemblyRootPart and obj.AssemblyRootPart.Name or "Self"
data.CollisionGroup = obj.CollisionGroup
data.NetworkOwner = GetNetworkOwner(obj)
-- Appearance
data.Color = FormatColor3(obj.Color)
data.ColorCode = string.format("Color3.new(%.4f, %.4f, %.4f)", obj.Color.R, obj.Color.G, obj.Color.B)
data.BrickColor = FormatBrickColor(obj.BrickColor)
data.Material = tostring(obj.Material):gsub("Enum.Material.", "")
data.MaterialVariant = obj.MaterialVariant ~= "" and obj.MaterialVariant or "None"
data.Transparency = FormatNumber(obj.Transparency, 4)
data.Reflectance = FormatNumber(obj.Reflectance, 4)
data.CastShadow = FormatBoolean(obj.CastShadow)
-- Surface Types
data.TopSurface = tostring(obj.TopSurface):gsub("Enum.SurfaceType.", "")
data.BottomSurface = tostring(obj.BottomSurface):gsub("Enum.SurfaceType.", "")
data.FrontSurface = tostring(obj.FrontSurface):gsub("Enum.SurfaceType.", "")
data.BackSurface = tostring(obj.BackSurface):gsub("Enum.SurfaceType.", "")
data.LeftSurface = tostring(obj.LeftSurface):gsub("Enum.SurfaceType.", "")
data.RightSurface = tostring(obj.RightSurface):gsub("Enum.SurfaceType.", "")
-- MeshPart specific
if obj:IsA("MeshPart") then
data.MeshId = obj.MeshId
data.TextureID = obj.TextureID
data.RenderFidelity = tostring(obj.RenderFidelity):gsub("Enum.RenderFidelity.", "")
data.CollisionFidelity = tostring(obj.CollisionFidelity):gsub("Enum.CollisionFidelity.", "")
data.DoubleSided = FormatBoolean(obj.DoubleSided)
end
-- UnionOperation specific
if obj:IsA("UnionOperation") then
data.UsePartColor = FormatBoolean(obj.UsePartColor)
data.SmoothingAngle = FormatNumber(obj.SmoothingAngle, 2) .. "°"
end
-- Part specific
if obj:IsA("Part") then
data.Shape = tostring(obj.Shape):gsub("Enum.PartType.", "")
end
-- Attributes & Tags
data.Attributes = GetAttributes(obj)
data.Tags = GetTags(obj)
-- Child Classes
data.ChildClasses = GetChildrenByClass(obj)
-- Special Components
data.HasClickDetector = obj:FindFirstChildOfClass("ClickDetector") and "✅ Yes" or "❌ No"
data.HasProximityPrompt = obj:FindFirstChildOfClass("ProximityPrompt") and "✅ Yes" or "❌ No"
data.HasSound = obj:FindFirstChildOfClass("Sound") and "✅ Yes" or "❌ No"
data.HasParticles = obj:FindFirstChildOfClass("ParticleEmitter") and "✅ Yes" or "❌ No"
data.HasLight = (obj:FindFirstChildOfClass("PointLight") or obj:FindFirstChildOfClass("SpotLight") or obj:FindFirstChildOfClass("SurfaceLight")) and "✅ Yes" or "❌ No"
data.HasDecal = obj:FindFirstChildOfClass("Decal") and "✅ Yes" or "❌ No"
data.HasTexture = obj:FindFirstChildOfClass("Texture") and "✅ Yes" or "❌ No"
data.HasScript = (obj:FindFirstChildOfClass("Script") or obj:FindFirstChildOfClass("LocalScript")) and "✅ Yes" or "❌ No"
-- Constraints
local constraints = {}
for _, child in pairs(obj:GetChildren()) do
if child:IsA("Constraint") then
table.insert(constraints, child.ClassName .. ": " .. child.Name)
end
end
data.Constraints = #constraints > 0 and constraints or {"None"}
-- Welds & Joints
local joints = {}
for _, child in pairs(obj:GetChildren()) do
if child:IsA("JointInstance") then
table.insert(joints, child.ClassName .. ": " .. child.Name)
end
end
data.Joints = #joints > 0 and joints or {"None"}
return data
end
local function InspectModel(obj)
local data = {}
-- Basic Info
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.Children = CountChildren(obj, false)
data.Descendants = CountChildren(obj, true)
data.HierarchyDepth = GetHierarchyDepth(obj)
data.EstimatedMemory = EstimateMemory(obj)
-- Model-specific
data.PrimaryPart = obj.PrimaryPart and obj.PrimaryPart.Name or "None"
data.ModelStreamingMode = tostring(obj.ModelStreamingMode):gsub("Enum.ModelStreamingMode.", "")
data.LevelOfDetail = tostring(obj.LevelOfDetail):gsub("Enum.ModelLevelOfDetail.", "")
-- Bounding Box
local success, cf, size = pcall(function() return obj:GetBoundingBox() end)
if success then
data.BoundingBoxPosition = FormatVector3(cf.Position)
data.BoundingBoxSize = FormatVector3(size)
data.BoundingBoxVolume = FormatNumber(size.X * size.Y * size.Z, 4) .. " studs³"
data.Position = FormatVector3(cf.Position)
data.CFrame = FormatCFrame(cf)
-- Distance & Direction
local distStr, distNum = GetDistance(obj)
data.Distance = distStr
data.DistanceRaw = distNum
data.Direction = GetDirectionTo(obj)
else
data.BoundingBoxPosition = "N/A"
data.BoundingBoxSize = "N/A"
data.BoundingBoxVolume = "N/A"
data.Position = "N/A"
data.Distance = "N/A"
data.Direction = "N/A"
end
-- Pivot
local pivotSuccess, pivot = pcall(function() return obj:GetPivot() end)
if pivotSuccess then
data.Pivot = FormatCFrame(pivot)
else
data.Pivot = "N/A"
end
-- Model Mass
local massSuccess, mass = pcall(function()
local totalMass = 0
for _, part in pairs(obj:GetDescendants()) do
if part:IsA("BasePart") then
totalMass = totalMass + part:GetMass()
end
end
return totalMass
end)
data.TotalMass = massSuccess and FormatNumber(mass, 4) .. " kg" or "N/A"
-- Part Count
local partCount = 0
local meshCount = 0
local unionCount = 0
for _, descendant in pairs(obj:GetDescendants()) do
if descendant:IsA("Part") then partCount = partCount + 1
elseif descendant:IsA("MeshPart") then meshCount = meshCount + 1
elseif descendant:IsA("UnionOperation") then unionCount = unionCount + 1
end
end
data.PartCount = partCount
data.MeshPartCount = meshCount
data.UnionCount = unionCount
data.TotalBaseParts = partCount + meshCount + unionCount
-- Humanoid Check
local humanoid = obj:FindFirstChildOfClass("Humanoid")
if humanoid then
data.HasHumanoid = "✅ Yes"
data.Health = FormatNumber(humanoid.Health, 1) .. " / " .. FormatNumber(humanoid.MaxHealth, 1)
data.HealthPercent = FormatNumber((humanoid.Health / humanoid.MaxHealth) * 100, 1) .. "%"
data.WalkSpeed = FormatNumber(humanoid.WalkSpeed, 2)
data.JumpPower = FormatNumber(humanoid.JumpPower, 2)
data.JumpHeight = FormatNumber(humanoid.JumpHeight, 2)
data.HipHeight = FormatNumber(humanoid.HipHeight, 2)
data.MaxSlopeAngle = FormatNumber(humanoid.MaxSlopeAngle, 2) .. "°"
data.HumanoidState = tostring(humanoid:GetState()):gsub("Enum.HumanoidStateType.", "")
data.MoveDirection = FormatVector3(humanoid.MoveDirection)
data.Sit = FormatBoolean(humanoid.Sit)
data.SeatPart = humanoid.SeatPart and humanoid.SeatPart.Name or "None"
data.PlatformStand = FormatBoolean(humanoid.PlatformStand)
data.AutoRotate = FormatBoolean(humanoid.AutoRotate)
data.AutoJumpEnabled = FormatBoolean(humanoid.AutoJumpEnabled)
data.DisplayName = humanoid.DisplayName
data.RigType = tostring(humanoid.RigType):gsub("Enum.HumanoidRigType.", "")
data.NameOcclusion = tostring(humanoid.NameOcclusion):gsub("Enum.NameOcclusion.", "")
data.HealthDisplayType = tostring(humanoid.HealthDisplayType):gsub("Enum.HumanoidHealthDisplayType.", "")
data.FloorMaterial = tostring(humanoid.FloorMaterial):gsub("Enum.Material.", "")
-- Body Parts
local hrp = obj:FindFirstChild("HumanoidRootPart")
if hrp then
data.HumanoidRootPartPos = FormatVector3(hrp.Position)
data.HumanoidRootPartVelocity = FormatVector3(hrp.AssemblyLinearVelocity)
data.CurrentSpeed = FormatNumber(hrp.AssemblyLinearVelocity.Magnitude, 2) .. " studs/s"
end
local head = obj:FindFirstChild("Head")
if head then
data.HeadPosition = FormatVector3(head.Position)
end
else
data.HasHumanoid = "❌ No"
end
-- Check for Player
local player = Players:GetPlayerFromCharacter(obj)
if player then
data.IsPlayerCharacter = "✅ Yes"
data.PlayerName = player.Name
data.PlayerDisplayName = player.DisplayName
data.PlayerUserId = tostring(player.UserId)
data.PlayerAccountAge = player.AccountAge .. " days"
data.PlayerTeam = player.Team and player.Team.Name or "None"
data.PlayerMembership = tostring(player.MembershipType):gsub("Enum.MembershipType.", "")
else
data.IsPlayerCharacter = "❌ No"
end
-- Attributes & Tags
data.Attributes = GetAttributes(obj)
data.Tags = GetTags(obj)
-- Child Classes
data.ChildClasses = GetChildrenByClass(obj)
return data
end
local function InspectTool(obj)
local data = {}
-- Basic Info
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.Children = CountChildren(obj, false)
data.Descendants = CountChildren(obj, true)
-- Tool Properties
data.ToolTip = obj.ToolTip ~= "" and obj.ToolTip or "None"
data.RequiresHandle = FormatBoolean(obj.RequiresHandle)
data.CanBeDropped = FormatBoolean(obj.CanBeDropped)
data.ManualActivationOnly = FormatBoolean(obj.ManualActivationOnly)
data.Enabled = FormatBoolean(obj.Enabled)
-- Handle
local handle = obj:FindFirstChild("Handle")
if handle then
data.HasHandle = "✅ Yes"
data.HandlePosition = FormatVector3(handle.Position)
data.HandleSize = FormatVector3(handle.Size)
local distStr = GetDistance(handle)
data.Distance = distStr
data.Direction = GetDirectionTo(handle)
else
data.HasHandle = "❌ No"
data.Distance = "N/A"
data.Direction = "N/A"
end
-- Grip
data.Grip = FormatCFrame(obj.Grip)
data.GripPos = FormatVector3(obj.GripPos)
data.GripForward = FormatVector3(obj.GripForward)
data.GripRight = FormatVector3(obj.GripRight)
data.GripUp = FormatVector3(obj.GripUp)
-- TextureId
data.TextureId = obj.TextureId ~= "" and obj.TextureId or "None"
-- Owner
if obj.Parent and obj.Parent:IsA("Backpack") then
local owner = obj.Parent.Parent
if owner:IsA("Player") then
data.Owner = owner.Name .. " (In Backpack)"
end
elseif obj.Parent and obj.Parent:IsA("Model") then
local player = Players:GetPlayerFromCharacter(obj.Parent)
if player then
data.Owner = player.Name .. " (Equipped)"
else
data.Owner = "NPC/Unknown"
end
else
data.Owner = "Dropped/World"
end
-- Attributes & Tags
data.Attributes = GetAttributes(obj)
data.Tags = GetTags(obj)
return data
end
local function InspectHumanoid(obj)
local data = {}
-- Basic
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
-- Humanoid Stats
data.Health = FormatNumber(obj.Health, 2)
data.MaxHealth = FormatNumber(obj.MaxHealth, 2)
data.HealthPercent = FormatNumber((obj.Health / obj.MaxHealth) * 100, 1) .. "%"
data.WalkSpeed = FormatNumber(obj.WalkSpeed, 2)
data.JumpPower = FormatNumber(obj.JumpPower, 2)
data.JumpHeight = FormatNumber(obj.JumpHeight, 2)
data.HipHeight = FormatNumber(obj.HipHeight, 2)
data.MaxSlopeAngle = FormatNumber(obj.MaxSlopeAngle, 2) .. "°"
-- State
data.State = tostring(obj:GetState()):gsub("Enum.HumanoidStateType.", "")
data.MoveDirection = FormatVector3(obj.MoveDirection)
data.MoveSpeed = FormatNumber(obj.MoveDirection.Magnitude * obj.WalkSpeed, 2) .. " studs/s"
-- Flags
data.Sit = FormatBoolean(obj.Sit)
data.SeatPart = obj.SeatPart and obj.SeatPart.Name or "None"
data.PlatformStand = FormatBoolean(obj.PlatformStand)
data.AutoRotate = FormatBoolean(obj.AutoRotate)
data.AutoJumpEnabled = FormatBoolean(obj.AutoJumpEnabled)
data.RequiresNeck = FormatBoolean(obj.RequiresNeck)
data.BreakJointsOnDeath = FormatBoolean(obj.BreakJointsOnDeath)
-- Display
data.DisplayName = obj.DisplayName
data.DisplayDistanceType = tostring(obj.DisplayDistanceType):gsub("Enum.HumanoidDisplayDistanceType.", "")
data.HealthDisplayDistance = FormatNumber(obj.HealthDisplayDistance, 0)
data.NameDisplayDistance = FormatNumber(obj.NameDisplayDistance, 0)
data.HealthDisplayType = tostring(obj.HealthDisplayType):gsub("Enum.HumanoidHealthDisplayType.", "")
data.NameOcclusion = tostring(obj.NameOcclusion):gsub("Enum.NameOcclusion.", "")
-- Type
data.RigType = tostring(obj.RigType):gsub("Enum.HumanoidRigType.", "")
data.FloorMaterial = tostring(obj.FloorMaterial):gsub("Enum.Material.", "")
-- Collision
data.UseJumpPower = FormatBoolean(obj.UseJumpPower)
data.EvaluateStateMachine = FormatBoolean(obj.EvaluateStateMachine)
-- Accessories Count
local accessories = {}
if obj.Parent then
for _, child in pairs(obj.Parent:GetChildren()) do
if child:IsA("Accessory") then
table.insert(accessories, child.Name)
end
end
end
data.Accessories = #accessories > 0 and accessories or {"None"}
data.AccessoryCount = #accessories
-- Body Colors
local bodyColors = obj.Parent and obj.Parent:FindFirstChildOfClass("BodyColors")
if bodyColors then
data.HasBodyColors = "✅ Yes"
data.HeadColor = FormatBrickColor(bodyColors.HeadColor)
data.TorsoColor = FormatBrickColor(bodyColors.TorsoColor)
else
data.HasBodyColors = "❌ No"
end
return data
end
local function InspectSound(obj)
local data = {}
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.SoundId = obj.SoundId
data.IsPlaying = FormatBoolean(obj.IsPlaying)
data.IsPaused = FormatBoolean(obj.IsPaused)
data.Playing = FormatBoolean(obj.Playing)
data.Looped = FormatBoolean(obj.Looped)
data.Volume = FormatNumber(obj.Volume, 4)
data.Pitch = FormatNumber(obj.Pitch, 4)
data.PlaybackSpeed = FormatNumber(obj.PlaybackSpeed, 4)
data.TimePosition = FormatTime(obj.TimePosition)
data.TimeLength = FormatTime(obj.TimeLength)
data.Progress = obj.TimeLength > 0 and FormatNumber((obj.TimePosition / obj.TimeLength) * 100, 1) .. "%" or "N/A"
data.RollOffMode = tostring(obj.RollOffMode):gsub("Enum.RollOffMode.", "")
data.RollOffMinDistance = FormatNumber(obj.RollOffMinDistance, 2)
data.RollOffMaxDistance = FormatNumber(obj.RollOffMaxDistance, 2)
data.SoundGroup = obj.SoundGroup and obj.SoundGroup.Name or "None"
return data
end
local function InspectLight(obj)
local data = {}
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.Enabled = FormatBoolean(obj.Enabled)
data.Color = FormatColor3(obj.Color)
data.Brightness = FormatNumber(obj.Brightness, 4)
data.Shadows = FormatBoolean(obj.Shadows)
if obj:IsA("PointLight") then
data.Range = FormatNumber(obj.Range, 2) .. " studs"
elseif obj:IsA("SpotLight") then
data.Range = FormatNumber(obj.Range, 2) .. " studs"
data.Angle = FormatNumber(obj.Angle, 2) .. "°"
data.Face = tostring(obj.Face):gsub("Enum.NormalId.", "")
elseif obj:IsA("SurfaceLight") then
data.Range = FormatNumber(obj.Range, 2) .. " studs"
data.Angle = FormatNumber(obj.Angle, 2) .. "°"
data.Face = tostring(obj.Face):gsub("Enum.NormalId.", "")
end
return data
end
local function InspectParticleEmitter(obj)
local data = {}
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.Enabled = FormatBoolean(obj.Enabled)
data.Texture = obj.Texture
data.Rate = FormatNumber(obj.Rate, 2) .. " particles/sec"
data.Lifetime = FormatNumber(obj.Lifetime.Min, 2) .. " - " .. FormatNumber(obj.Lifetime.Max, 2) .. " sec"
data.Speed = FormatNumber(obj.Speed.Min, 2) .. " - " .. FormatNumber(obj.Speed.Max, 2) .. " studs/s"
data.Rotation = FormatNumber(obj.Rotation.Min, 2) .. " - " .. FormatNumber(obj.Rotation.Max, 2) .. "°"
data.RotSpeed = FormatNumber(obj.RotSpeed.Min, 2) .. " - " .. FormatNumber(obj.RotSpeed.Max, 2) .. "°/s"
data.SpreadAngle = FormatVector2(obj.SpreadAngle)
data.Acceleration = FormatVector3(obj.Acceleration)
data.Drag = FormatNumber(obj.Drag, 4)
data.VelocityInheritance = FormatNumber(obj.VelocityInheritance, 4)
data.ZOffset = FormatNumber(obj.ZOffset, 2)
data.EmissionDirection = tostring(obj.EmissionDirection):gsub("Enum.NormalId.", "")
data.Shape = tostring(obj.Shape):gsub("Enum.ParticleEmitterShape.", "")
data.LightEmission = FormatNumber(obj.LightEmission, 4)
data.LightInfluence = FormatNumber(obj.LightInfluence, 4)
return data
end
local function InspectProximityPrompt(obj)
local data = {}
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.Enabled = FormatBoolean(obj.Enabled)
data.ActionText = obj.ActionText
data.ObjectText = obj.ObjectText
data.KeyboardKeyCode = tostring(obj.KeyboardKeyCode):gsub("Enum.KeyCode.", "")
data.GamepadKeyCode = tostring(obj.GamepadKeyCode):gsub("Enum.KeyCode.", "")
data.HoldDuration = FormatNumber(obj.HoldDuration, 2) .. " sec"
data.MaxActivationDistance = FormatNumber(obj.MaxActivationDistance, 2) .. " studs"
data.RequiresLineOfSight = FormatBoolean(obj.RequiresLineOfSight)
data.Exclusivity = tostring(obj.Exclusivity):gsub("Enum.ProximityPromptExclusivity.", "")
data.Style = tostring(obj.Style):gsub("Enum.ProximityPromptStyle.", "")
data.ClickablePrompt = FormatBoolean(obj.ClickablePrompt)
data.AutoLocalize = FormatBoolean(obj.AutoLocalize)
return data
end
local function InspectClickDetector(obj)
local data = {}
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.MaxActivationDistance = FormatNumber(obj.MaxActivationDistance, 2) .. " studs"
data.CursorIcon = obj.CursorIcon ~= "" and obj.CursorIcon or "Default"
return data
end
local function InspectGeneric(obj)
local data = {}
data.Name = obj.Name
data.ClassName = obj.ClassName
data.FullPath = obj:GetFullName()
data.Parent = obj.Parent and obj.Parent.Name or "None"
data.ObjectType = GetObjectType(obj)
data.Children = CountChildren(obj, false)
data.Descendants = CountChildren(obj, true)
data.HierarchyDepth = GetHierarchyDepth(obj)
-- Try to get common properties
pcall(function()
if obj:IsA("ValueBase") then
data.Value = tostring(obj.Value)
end
end)
-- Attributes & Tags
data.Attributes = GetAttributes(obj)
data.Tags = GetTags(obj)
-- Child Classes
data.ChildClasses = GetChildrenByClass(obj)
return data
end
-- ═══════════════════════════════════════════════════════════
-- 🔍 MASTER INSPECT FUNCTION
-- ═══════════════════════════════════════════════════════════
local function InspectObject(obj)
if not obj then return nil end
local data
if obj:IsA("BasePart") then
data = InspectBasePart(obj)
elseif obj:IsA("Model") then
data = InspectModel(obj)
elseif obj:IsA("Tool") then
data = InspectTool(obj)
elseif obj:IsA("Humanoid") then
data = InspectHumanoid(obj)
elseif obj:IsA("Sound") then
data = InspectSound(obj)
elseif obj:IsA("Light") then
data = InspectLight(obj)
elseif obj:IsA("ParticleEmitter") then
data = InspectParticleEmitter(obj)
elseif obj:IsA("ProximityPrompt") then
data = InspectProximityPrompt(obj)
elseif obj:IsA("ClickDetector") then
data = InspectClickDetector(obj)
else
data = InspectGeneric(obj)
end
return data
end
-- ═══════════════════════════════════════════════════════════
-- 📋 GENERATE FULL REPORT
-- ═══════════════════════════════════════════════════════════
local function GenerateFullReport(data)
if not data then return "" end
local report = [[
╔══════════════════════════════════════════════════════════════╗
║ 🔍 ULTIMATE OBJECT INSPECTOR - FULL REPORT ║
╚══════════════════════════════════════════════════════════════╝
Generated: ]] .. os.date("%Y-%m-%d %H:%M:%S") .. [[
═══════════════════════════════════════════════════════════════
📋 BASIC INFORMATION
═══════════════════════════════════════════════════════════════
]]
local function addLine(label, value)
if value ~= nil then
report = report .. string.format("%-25s: %s\n", label, tostring(value))
end
end
local function addSection(title)
report = report .. "\n═══════════════════════════════════════════════════════════════\n"
report = report .. title .. "\n"
report = report .. "═══════════════════════════════════════════════════════════════\n"
end
-- Basic Info
addLine("Name", data.Name)
addLine("ClassName", data.ClassName)
addLine("Type", data.ObjectType)
addLine("Full Path", data.FullPath)
addLine("Parent", data.Parent)
addLine("Children", data.Children)
addLine("Descendants", data.Descendants)
addLine("Hierarchy Depth", data.HierarchyDepth)
addLine("Est. Memory", data.EstimatedMemory)
-- Distance
if data.Distance then
addSection("📏 DISTANCE & DIRECTION")
addLine("Distance", data.Distance)
addLine("Direction", data.Direction)
end
-- Transform
if data.Position then
addSection("📐 TRANSFORM & POSITION")
addLine("Position", data.Position)
addLine("Position (Code)", data.PositionCode)
addLine("Rotation", data.Rotation)
addLine("Orientation", data.Orientation)
addLine("Size", data.Size)
addLine("Size (Code)", data.SizeCode)
addLine("Volume", data.Volume)
addLine("CFrame", data.CFrame)
addLine("LookVector", data.LookVector)
addLine("UpVector", data.UpVector)
addLine("RightVector", data.RightVector)
addLine("Pivot", data.Pivot or data.PivotOffset)
end
-- Bounding Box (for Models)
if data.BoundingBoxPosition then
addSection("📦 BOUNDING BOX")
addLine("BB Position", data.BoundingBoxPosition)
addLine("BB Size", data.BoundingBoxSize)
addLine("BB Volume", data.BoundingBoxVolume)
end
-- Physics
if data.Anchored then
addSection("⚡ PHYSICS PROPERTIES")
addLine("Anchored", data.Anchored)
addLine("CanCollide", data.CanCollide)
addLine("CanTouch", data.CanTouch)
addLine("CanQuery", data.CanQuery)
addLine("Massless", data.Massless)
addLine("Mass", data.Mass)
addLine("Density", data.Density)
addLine("Friction", data.Friction)
addLine("Elasticity", data.Elasticity)
addLine("Velocity", data.Velocity)
addLine("Speed", data.Speed)
addLine("Angular Velocity", data.AngularVelocity)
addLine("Root Part", data.RootPart)
addLine("Collision Group", data.CollisionGroup)
addLine("Network Owner", data.NetworkOwner)
end
-- Model Stats
if data.TotalMass then
addSection("📊 MODEL STATISTICS")
addLine("Total Mass", data.TotalMass)
addLine("Part Count", data.PartCount)
addLine("MeshPart Count", data.MeshPartCount)
addLine("Union Count", data.UnionCount)
addLine("Total BaseParts", data.TotalBaseParts)
addLine("Primary Part", data.PrimaryPart)
addLine("Streaming Mode", data.ModelStreamingMode)
addLine("Level of Detail", data.LevelOfDetail)
end
-- Appearance
if data.Color then
addSection("🎨 APPEARANCE")
addLine("Color", data.Color)
addLine("Color (Code)", data.ColorCode)
addLine("BrickColor", data.BrickColor)
addLine("Material", data.Material)
addLine("Material Variant", data.MaterialVariant)
addLine("Transparency", data.Transparency)
addLine("Reflectance", data.Reflectance)
addLine("Cast Shadow", data.CastShadow)
end
-- Surface Types
if data.TopSurface then
addSection("🧱 SURFACE TYPES")
addLine("Top", data.TopSurface)
addLine("Bottom", data.BottomSurface)
addLine("Front", data.FrontSurface)
addLine("Back", data.BackSurface)
addLine("Left", data.LeftSurface)
addLine("Right", data.RightSurface)
end
-- MeshPart
if data.MeshId then
addSection("🔷 MESHPART PROPERTIES")
addLine("MeshId", data.MeshId)
addLine("TextureID", data.TextureID)
addLine("Render Fidelity", data.RenderFidelity)
addLine("Collision Fidelity", data.CollisionFidelity)
addLine("Double Sided", data.DoubleSided)
end
-- Union
if data.UsePartColor then
addSection("🔶 UNION PROPERTIES")
addLine("Use Part Color", data.UsePartColor)
addLine("Smoothing Angle", data.SmoothingAngle)
end
-- Humanoid
if data.Health or data.HasHumanoid == "✅ Yes" then
addSection("🤖 HUMANOID PROPERTIES")
addLine("Has Humanoid", data.HasHumanoid)
addLine("Health", data.Health)
addLine("Max Health", data.MaxHealth)
addLine("Health %", data.HealthPercent)
addLine("WalkSpeed", data.WalkSpeed)
addLine("JumpPower", data.JumpPower)
addLine("JumpHeight", data.JumpHeight)
addLine("HipHeight", data.HipHeight)
addLine("Max Slope Angle", data.MaxSlopeAngle)
addLine("State", data.State or data.HumanoidState)
addLine("Move Direction", data.MoveDirection)
addLine("Move Speed", data.MoveSpeed)
addLine("Sit", data.Sit)
addLine("Seat Part", data.SeatPart)
addLine("Platform Stand", data.PlatformStand)
addLine("Auto Rotate", data.AutoRotate)
addLine("Auto Jump", data.AutoJumpEnabled)
addLine("Display Name", data.DisplayName)
addLine("Rig Type", data.RigType)
addLine("Floor Material", data.FloorMaterial)
addLine("Name Occlusion", data.NameOcclusion)
addLine("Health Display", data.HealthDisplayType)
end
-- Player Info
if data.IsPlayerCharacter == "✅ Yes" then
addSection("👤 PLAYER INFORMATION")
addLine("Is Player", data.IsPlayerCharacter)
addLine("Player Name", data.PlayerName)
addLine("Display Name", data.PlayerDisplayName)
addLine("UserId", data.PlayerUserId)
addLine("Account Age", data.PlayerAccountAge)
addLine("Team", data.PlayerTeam)
addLine("Membership", data.PlayerMembership)
end
-- Tool Properties
if data.ToolTip then
addSection("🔧 TOOL PROPERTIES")
addLine("ToolTip", data.ToolTip)
addLine("Requires Handle", data.RequiresHandle)
addLine("Can Be Dropped", data.CanBeDropped)
addLine("Manual Activation", data.ManualActivationOnly)
addLine("Enabled", data.Enabled)
addLine("Has Handle", data.HasHandle)
addLine("Handle Position", data.HandlePosition)
addLine("Handle Size", data.HandleSize)
addLine("Grip", data.Grip)
addLine("TextureId", data.TextureId)
addLine("Owner", data.Owner)
end
-- Sound Properties
if data.SoundId then
addSection("🔊 SOUND PROPERTIES")
addLine("SoundId", data.SoundId)
addLine("Is Playing", data.IsPlaying)
addLine("Is Paused", data.IsPaused)
addLine("Looped", data.Looped)
addLine("Volume", data.Volume)
addLine("Pitch", data.Pitch)
addLine("Playback Speed", data.PlaybackSpeed)
addLine("Time Position", data.TimePosition)
addLine("Time Length", data.TimeLength)
addLine("Progress", data.Progress)
addLine("RollOff Mode", data.RollOffMode)
addLine("RollOff Min", data.RollOffMinDistance)
addLine("RollOff Max", data.RollOffMaxDistance)
addLine("Sound Group", data.SoundGroup)
end
-- Light Properties
if data.Brightness and data.Shadows then
addSection("💡 LIGHT PROPERTIES")
addLine("Enabled", data.Enabled)
addLine("Color", data.Color)
addLine("Brightness", data.Brightness)
addLine("Shadows", data.Shadows)
addLine("Range", data.Range)
addLine("Angle", data.Angle)
addLine("Face", data.Face)
end
-- Particle Properties
if data.Rate then
addSection("✨ PARTICLE PROPERTIES")
addLine("Enabled", data.Enabled)
addLine("Texture", data.Texture)
addLine("Rate", data.Rate)
addLine("Lifetime", data.Lifetime)
addLine("Speed", data.Speed)
addLine("Rotation", data.Rotation)
addLine("Rot Speed", data.RotSpeed)
addLine("Spread Angle", data.SpreadAngle)
addLine("Acceleration", data.Acceleration)
addLine("Drag", data.Drag)
addLine("Emission Direction", data.EmissionDirection)
addLine("Shape", data.Shape)
addLine("Light Emission", data.LightEmission)
end
-- ProximityPrompt
if data.ActionText then
addSection("💬 PROXIMITY PROMPT")
addLine("Enabled", data.Enabled)
addLine("Action Text", data.ActionText)
addLine("Object Text", data.ObjectText)
addLine("Keyboard Key", data.KeyboardKeyCode)
addLine("Gamepad Key", data.GamepadKeyCode)
addLine("Hold Duration", data.HoldDuration)
addLine("Max Distance", data.MaxActivationDistance)
addLine("Line of Sight", data.RequiresLineOfSight)
addLine("Exclusivity", data.Exclusivity)
addLine("Style", data.Style)
end
-- Special Components
if data.HasClickDetector then
addSection("🔌 SPECIAL COMPONENTS")
addLine("Click Detector", data.HasClickDetector)
addLine("Proximity Prompt", data.HasProximityPrompt)
addLine("Sound", data.HasSound)
addLine("Particles", data.HasParticles)
addLine("Light", data.HasLight)
addLine("Decal", data.HasDecal)
addLine("Texture", data.HasTexture)
addLine("Script", data.HasScript)
end
-- Constraints
if data.Constraints and #data.Constraints > 0 and data.Constraints[1] ~= "None" then
addSection("⛓️ CONSTRAINTS")
for i, constraint in ipairs(data.Constraints) do
report = report .. string.format(" [%d] %s\n", i, constraint)
end
end
-- Joints
if data.Joints and #data.Joints > 0 and data.Joints[1] ~= "None" then
addSection("🔗 JOINTS & WELDS")
for i, joint in ipairs(data.Joints) do
report = report .. string.format(" [%d] %s\n", i, joint)
end
end
-- Accessories
if data.Accessories and #data.Accessories > 0 and data.Accessories[1] ~= "None" then
addSection("👒 ACCESSORIES")
addLine("Count", data.AccessoryCount)
for i, acc in ipairs(data.Accessories) do
report = report .. string.format(" [%d] %s\n", i, acc)
end
end
-- Attributes
if data.Attributes and #data.Attributes > 0 then
addSection("📊 ATTRIBUTES")
for _, attr in ipairs(data.Attributes) do
report = report .. string.format(" %s (%s): %s\n", attr.Name, attr.Type, attr.Value)
end
end
-- Tags
if data.Tags and #data.Tags > 0 then
addSection("🏷️ TAGS")
for i, tag in ipairs(data.Tags) do
report = report .. string.format(" [%d] %s\n", i, tag)
end
end
-- Child Classes
if data.ChildClasses and next(data.ChildClasses) then
addSection("🌳 CHILD CLASSES BREAKDOWN")
for className, count in pairs(data.ChildClasses) do
report = report .. string.format(" %-25s: %d\n", className, count)
end
end
-- Value (for ValueBase)
if data.Value then
addSection("📈 VALUE")
addLine("Value", data.Value)
end
report = report .. [[
═══════════════════════════════════════════════════════════════
END OF REPORT
═══════════════════════════════════════════════════════════════
]]
return report
end
-- ═══════════════════════════════════════════════════════════
-- 🔄 UPDATE GUI FUNCTION
-- ═══════════════════════════════════════════════════════════
local function UpdateInspectorGUI()
if not SelectedObject then
CopiedData = ""
return
end
-- Check if object still exists
local success = pcall(function() local _ = SelectedObject.Parent end)
if not success then
SelectedObject = nil
RemoveHighlight()
CurrentSelectionLabel:Set("📦 Selected: [DELETED]")
ObjectTypeLabel:Set("📁 Type: N/A")
DistanceLabel:Set("📏 Distance: N/A")
DirectionLabel:Set("🧭 Direction: N/A")
CopiedData = ""
return
end
-- Get inspection data
local data = InspectObject(SelectedObject)
if not data then return end
-- Generate full report for copy
CopiedData = GenerateFullReport(data)
-- Update Selection Labels
CurrentSelectionLabel:Set("📦 Selected: " .. (data.Name or "Unknown"))
ObjectTypeLabel:Set("📁 Type: " .. (data.ObjectType or "Unknown"))
-- Update Distance & Direction
if data.Distance then
DistanceLabel:Set("📏 Distance: " .. data.Distance)
DirectionLabel:Set("🧭 Direction: " .. (data.Direction or "N/A"))
end
-- Update Basic Info
NameLabel:Set("Name: " .. (data.Name or "N/A"))
ClassLabel:Set("ClassName: " .. (data.ClassName or "N/A"))
FullPathLabel:Set("Path: " .. (data.FullPath or "N/A"))
ParentLabel:Set("Parent: " .. (data.Parent or "N/A"))
ChildrenLabel:Set("Children: " .. (data.Children or "N/A"))
DescendantsLabel:Set("Descendants: " .. (data.Descendants or "N/A"))
MemoryLabel:Set("Est. Memory: " .. (data.EstimatedMemory or "N/A"))
DepthLabel:Set("Hierarchy Depth: " .. (data.HierarchyDepth or "N/A"))
-- Update Transform
PositionLabel:Set("Position: " .. (data.Position or data.BoundingBoxPosition or "N/A"))
RotationLabel:Set("Rotation: " .. (data.Rotation or "N/A"))
OrientationLabel:Set("Orientation: " .. (data.Orientation or "N/A"))
SizeLabel:Set("Size: " .. (data.Size or data.BoundingBoxSize or "N/A"))
VolumeLabel:Set("Volume: " .. (data.Volume or data.BoundingBoxVolume or "N/A"))
LookVectorLabel:Set("LookVector: " .. (data.LookVector or "N/A"))
UpVectorLabel:Set("UpVector: " .. (data.UpVector or "N/A"))
RightVectorLabel:Set("RightVector: " .. (data.RightVector or "N/A"))
PivotLabel:Set("Pivot Offset: " .. (data.PivotOffset or data.Pivot or "N/A"))
-- Update Physics
AnchoredLabel:Set("Anchored: " .. (data.Anchored or "N/A"))
CanCollideLabel:Set("CanCollide: " .. (data.CanCollide or "N/A"))
CanTouchLabel:Set("CanTouch: " .. (data.CanTouch or "N/A"))
CanQueryLabel:Set("CanQuery: " .. (data.CanQuery or "N/A"))
MassLabel:Set("Mass: " .. (data.Mass or data.TotalMass or "N/A"))
DensityLabel:Set("Density: " .. (data.Density or "N/A"))
VelocityLabel:Set("Velocity: " .. (data.Velocity or data.HumanoidRootPartVelocity or "N/A"))
AngularVelocityLabel:Set("Angular Velocity: " .. (data.AngularVelocity or "N/A"))
RootPartLabel:Set("RootPart: " .. (data.RootPart or data.PrimaryPart or "N/A"))
CollisionGroupLabel:Set("Collision Group: " .. (data.CollisionGroup or "N/A"))
NetworkOwnerLabel:Set("Network Owner: " .. (data.NetworkOwner or "N/A"))
-- Update Appearance
ColorLabel:Set("Color: " .. (data.Color or "N/A"))
BrickColorLabel:Set("BrickColor: " .. (data.BrickColor or "N/A"))
MaterialLabel:Set("Material: " .. (data.Material or "N/A"))
MaterialVariantLabel:Set("Material Variant: " .. (data.MaterialVariant or "N/A"))
TransparencyLabel:Set("Transparency: " .. (data.Transparency or "N/A"))
ReflectanceLabel:Set("Reflectance: " .. (data.Reflectance or "N/A"))
CastShadowLabel:Set("CastShadow: " .. (data.CastShadow or "N/A"))
if data.TopSurface then
SurfaceTypesLabel:Set("Surfaces: T:" .. data.TopSurface .. " B:" .. data.BottomSurface .. " F:" .. data.FrontSurface)
else
SurfaceTypesLabel:Set("Surface Types: N/A")
end
-- Update Humanoid
if data.Health or data.HasHumanoid == "✅ Yes" then
HealthLabel:Set("Health: " .. (data.Health or "N/A"))
MaxHealthLabel:Set("MaxHealth: " .. (data.MaxHealth or "N/A"))
WalkSpeedLabel:Set("WalkSpeed: " .. (data.WalkSpeed or "N/A"))
JumpPowerLabel:Set("JumpPower: " .. (data.JumpPower or "N/A"))
JumpHeightLabel:Set("JumpHeight: " .. (data.JumpHeight or "N/A"))
HipHeightLabel:Set("HipHeight: " .. (data.HipHeight or "N/A"))
StateLabel:Set("State: " .. (data.State or data.HumanoidState or "N/A"))
SitLabel:Set("Sit: " .. (data.Sit or "N/A") .. " | Seat: " .. (data.SeatPart or "N/A"))
DisplayNameLabel:Set("DisplayName: " .. (data.DisplayName or "N/A"))
RigTypeLabel:Set("RigType: " .. (data.RigType or "N/A"))
else
HealthLabel:Set("Health: N/A (No Humanoid)")
MaxHealthLabel:Set("MaxHealth: N/A")
WalkSpeedLabel:Set("WalkSpeed: N/A")
JumpPowerLabel:Set("JumpPower: N/A")
JumpHeightLabel:Set("JumpHeight: N/A")
HipHeightLabel:Set("HipHeight: N/A")
StateLabel:Set("State: N/A")
SitLabel:Set("Sit: N/A")
DisplayNameLabel:Set("DisplayName: N/A")
RigTypeLabel:Set("RigType: N/A")
end
-- Update Attributes
if data.Attributes and #data.Attributes > 0 then
local attrStr = ""
for i, attr in ipairs(data.Attributes) do
if i <= 5 then
attrStr = attrStr .. attr.Name .. "=" .. attr.Value .. "; "
end
end
if #data.Attributes > 5 then
attrStr = attrStr .. "(+" .. (#data.Attributes - 5) .. " more)"
end
AttributesLabel:Set("Attributes: " .. attrStr)
else
AttributesLabel:Set("Attributes: None")
end
-- Update Tags
if data.Tags and #data.Tags > 0 then
TagsLabel:Set("Tags: " .. table.concat(data.Tags, ", "))
else
TagsLabel:Set("Tags: None")
end
-- Update Child Classes
if data.ChildClasses and next(data.ChildClasses) then
local classStr = ""
local count = 0
for className, num in pairs(data.ChildClasses) do
if count < 4 then
classStr = classStr .. className .. "(" .. num .. ") "
count = count + 1
end
end
ChildClassesLabel:Set("Child Classes: " .. classStr)
else
ChildClassesLabel:Set("Child Classes: None")
end
end
-- ═══════════════════════════════════════════════════════════
-- 👤 UPDATE PLAYER INFO FUNCTION
-- ═══════════════════════════════════════════════════════════
local function UpdatePlayerInfo()
-- Team Update
PTeamLabel:Set("Team: " .. (Player.Team and Player.Team.Name or "None"))
-- Character Info
if Player.Character and Player.Character:FindFirstChild("HumanoidRootPart") then
local hrp = Player.Character.HumanoidRootPart
local humanoid = Player.Character:FindFirstChildOfClass("Humanoid")
CharPosLabel:Set("Position: " .. FormatVector3Short(hrp.Position))
CharVelocityLabel:Set("Velocity: " .. FormatVector3Short(hrp.AssemblyLinearVelocity))
CharSpeedLabel:Set("Current Speed: " .. FormatNumber(hrp.AssemblyLinearVelocity.Magnitude, 2) .. " studs/s")
if humanoid then
CharHealthLabel:Set("Health: " .. FormatNumber(humanoid.Health, 1) .. "/" .. FormatNumber(humanoid.MaxHealth, 1))
CharWalkLabel:Set("WalkSpeed: " .. FormatNumber(humanoid.WalkSpeed, 2))
CharJumpLabel:Set("JumpPower: " .. FormatNumber(humanoid.JumpPower, 2))
CharLookLabel:Set("Look Direction: " .. FormatVector3Short(hrp.CFrame.LookVector))
CharMoveLabel:Set("Move Direction: " .. FormatVector3Short(humanoid.MoveDirection))
CharStateLabel:Set("State: " .. tostring(humanoid:GetState()):gsub("Enum.HumanoidStateType.", ""))
CharFloorLabel:Set("Floor Material: " .. tostring(humanoid.FloorMaterial):gsub("Enum.Material.", ""))
end
else
CharPosLabel:Set("Position: Character not found")
CharVelocityLabel:Set("Velocity: N/A")
CharSpeedLabel:Set("Current Speed: N/A")
CharHealthLabel:Set("Health: N/A")
end
-- Camera Info
CamPosLabel:Set("Position: " .. FormatVector3Short(Camera.CFrame.Position))
CamLookLabel:Set("Look Vector: " .. FormatVector3Short(Camera.CFrame.LookVector))
CamFOVLabel:Set("FOV: " .. FormatNumber(Camera.FieldOfView, 1) .. "°")
CamTypeLabel:Set("Type: " .. tostring(Camera.CameraType):gsub("Enum.CameraType.", ""))
CamFocusLabel:Set("Focus: " .. FormatVector3Short(Camera.Focus.Position))
CamSubjectLabel:Set("Subject: " .. (Camera.CameraSubject and Camera.CameraSubject.Name or "None"))
if Camera.CameraSubject and Camera.CameraSubject:IsA("Humanoid") then
local subjectPos = Camera.CameraSubject.Parent:FindFirstChild("HumanoidRootPart")
if subjectPos then
local dist = (Camera.CFrame.Position - subjectPos.Position).Magnitude
CamDistLabel:Set("View Distance: " .. FormatNumber(dist, 2) .. " studs")
end
else
CamDistLabel:Set("View Distance: N/A")
end
-- Tools
local equippedTool = Player.Character and Player.Character:FindFirstChildOfClass("Tool")
EquippedToolLabel:Set("Equipped: " .. (equippedTool and equippedTool.Name or "None"))
local backpackItems = {}
for _, item in pairs(Player.Backpack:GetChildren()) do
if item:IsA("Tool") then
table.insert(backpackItems, item.Name)
end
end
BackpackLabel:Set("Backpack: " .. (#backpackItems > 0 and table.concat(backpackItems, ", ") or "Empty"))
end
-- ═══════════════════════════════════════════════════════════
-- 🌍 UPDATE WORLD INFO FUNCTION
-- ═══════════════════════════════════════════════════════════
local function UpdateWorldInfo()
-- Player Count
PlayerCountLabel:Set("Players: " .. #Players:GetPlayers() .. "/" .. Players.MaxPlayers)
-- Server Time
ServerTimeLabel:Set("Server Time: " .. FormatTime(Workspace:GetServerTimeNow()))
-- Lighting
LightingTimeLabel:Set("Time of Day: " .. Lighting.TimeOfDay)
AmbientLabel:Set("Ambient: " .. FormatColor3(Lighting.Ambient))
BrightnessLabel:Set("Brightness: " .. Lighting.Brightness)
FogLabel:Set("Fog: " .. Lighting.FogStart .. " - " .. Lighting.FogEnd)
GravityLabel:Set("Gravity: " .. Workspace.Gravity .. " studs/s²")
end
-- ═══════════════════════════════════════════════════════════
-- ⌨️ INPUT HANDLING
-- ═══════════════════════════════════════════════════════════
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
-- Quick Select (Q)
if input.KeyCode == Settings.SelectHotkey then
if Mouse.Target then
SelectedObject = Mouse.Target
CreateHighlight(Mouse.Target)
CurrentSelectionLabel:Set("📦 Selected: " .. Mouse.Target.Name)
ObjectTypeLabel:Set("📁 Type: " .. GetObjectType(Mouse.Target))
local dist = GetDistance(Mouse.Target)
DistanceLabel:Set("📏 Distance: " .. dist)
DirectionLabel:Set("🧭 Direction: " .. GetDirectionTo(Mouse.Target))
-- Force immediate update
UpdateInspectorGUI()
Rayfield:Notify({
Title = "⚡ Quick Select",
Content = Mouse.Target.Name .. " (" .. Mouse.Target.ClassName .. ")",
Duration = 1.5
})
end
end
-- Clear (X)
if input.KeyCode == Settings.ClearHotkey then
SelectedObject = nil
RemoveHighlight()
CurrentSelectionLabel:Set("📦 Selected: None")
ObjectTypeLabel:Set("📁 Type: N/A")
DistanceLabel:Set("📏 Distance: N/A")
DirectionLabel:Set("🧭 Direction: N/A")
CopiedData = ""
Rayfield:Notify({
Title = "🗑️ Cleared",
Content = "Selection cleared!",
Duration = 1
})
end
end)
-- ═══════════════════════════════════════════════════════════
-- 🔁 MAIN UPDATE LOOP
-- ═══════════════════════════════════════════════════════════
local lastInspectorUpdate = 0
local lastPlayerUpdate = 0
local lastWorldUpdate = 0
RunService.Heartbeat:Connect(function()
local currentTime = tick()
-- Update Inspector (if auto refresh enabled)
if Settings.AutoRefresh and SelectedObject then
if currentTime - lastInspectorUpdate >= Settings.RefreshRate then
lastInspectorUpdate = currentTime
pcall(UpdateInspectorGUI)
end
end
-- Update Player Info every 0.2 seconds
if currentTime - lastPlayerUpdate >= 0.2 then
lastPlayerUpdate = currentTime
pcall(UpdatePlayerInfo)
end
-- Update World Info every 1 second
if currentTime - lastWorldUpdate >= 1 then
lastWorldUpdate = currentTime
pcall(UpdateWorldInfo)
end
end)
-- ═══════════════════════════════════════════════════════════
-- 🧹 CLEANUP ON PLAYER LEAVING
-- ═══════════════════════════════════════════════════════════
Player.AncestryChanged:Connect(function()
RemoveHighlight()
end)
-- ═══════════════════════════════════════════════════════════
-- ✅ INITIALIZATION COMPLETE
-- ═══════════════════════════════════════════════════════════
Rayfield:Notify({
Title = "🔍 Ultimate Inspector Loaded!",
Content = "Press Q to quick select objects. View full details in Inspector tab!",
Duration = 5
})
print("═══════════════════════════════════════════════════════════════")
print("✅ [INSPECTOR] Part 2 loaded successfully!")
print("✅ [INSPECTOR] Ultimate Object Inspector is now active!")
print("═══════════════════════════════════════════════════════════════")
print("")
print("📌 HOTKEYS:")
print(" Q - Quick select object under cursor")
print(" X - Clear current selection")
print(" RightShift - Toggle GUI visibility (Rayfield default)")
print("")
print("📋 FEATURES:")
print(" • Inspect any object in detail")
print(" • Real-time distance & direction tracking")
print(" • Copy any data to clipboard")
print(" • Player & World info tabs")
print(" • Custom highlight system")
print(" • Auto-refresh capability")
print("")
print("═══════════════════════════════════════════════════════════════")



so good