JIT
XRay script for visible parts only
-- XRay Script for Roblox (Educational Purpose) -- Place this LocalScript in StarterPlayerScripts. -- This script makes buildings/parts semi-transparent to see through walls -- Press N to toggle XRay mode local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Workspace = game:GetService("Workspace") local LocalPlayer = Players.LocalPlayer -- Settings local XRayKey = Enum.KeyCode.N local TransparencyAmount = 0.5 -- 0 = fully visible, 1 = fully transparent local RefreshRate = 0.1 -- seconds between updates local MaxDistance = 2000 -- studs from player to affect parts local ExcludedNames = {"Terrain", "BasePlate"} -- Parts to exclude from XRay -- State local xRayEnabled = false local originalTransparency = {} local lastUpdate = 0 -- Helper: check if part should be excluded local function shouldExcludePart(part) for _, name in ipairs(ExcludedNames) do if part.Name == name then return true end end return false end -- Helper: get all parts within range of player local function getPartsInRange() local parts = {} local character = LocalPlayer.Character if not character then return parts end local humanoidRootPart = character:FindFirstChild("HumanoidRootPart") if not humanoidRootPart then return parts end local playerPosition = humanoidRootPart.Position for _, part in ipairs(Workspace:GetDescendants()) do if part:IsA("BasePart") and not shouldExcludePart(part) then local distance = (part.Position - playerPosition).Magnitude if distance <= MaxDistance then table.insert(parts, part) end end end return parts end -- Enable XRay: make parts semi-transparent local function enableXRay() local parts = getPartsInRange() for _, part in ipairs(parts) do if not originalTransparency[part] then originalTransparency[part] = part.Transparency end part.Transparency = TransparencyAmount end xRayEnabled = true print("XRay Enabled - Parts made semi-transparent") end -- Disable XRay: restore original transparency local function disableXRay() for part, transparency in pairs(originalTransparency) do if part.Parent then -- Make sure part still exists part.Transparency = transparency end end originalTransparency = {} xRayEnabled = false print("XRay Disabled - Transparency restored") end -- Toggle XRay with N key UserInputService.InputBegan:Connect(function(input, gameProcessedEvent) if gameProcessedEvent then return end if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == XRayKey then if xRayEnabled then disableXRay() else enableXRay() end end end) -- Periodic update to maintain XRay effect and handle moving parts RunService.Heartbeat:Connect(function(step) if not xRayEnabled then return end lastUpdate = lastUpdate + step if lastUpdate >= RefreshRate then lastUpdate = 0 -- Update transparency for existing parts local parts = getPartsInRange() for _, part in ipairs(parts) do if not originalTransparency[part] then originalTransparency[part] = part.Transparency end part.Transparency = TransparencyAmount end -- Clean up references to destroyed parts for part in pairs(originalTransparency) do if not part.Parent then originalTransparency[part] = nil end end end end) -- Clean up when script is destroyed script.Destroying:Connect(function() if xRayEnabled then disableXRay() end end) make this xray script work only for parts that are visible, not things that are invisible: "parts or buildings, or terrain"

I'll analyze this XRay script and modify it to only affect visible parts by checking if they are actually visible to the player.

Let me check the current directory structure to understand the environment:

Since we're working in an empty directory, I'll assume we need to create this XRay script. The user wants to modify the script to only affect visible parts (not invisible ones). I'll add visibility checks by ensuring parts have Transparency < 1 and are not completely invisible.

Write file
XRay script now only targets visible parts
v1