Quick actions

cmd+k|ctrl+k

Navigation

Languages

2D Raycast Renderer in Lua Sandbox Place 1 (Roblox

Snippet info

Language

Lua

Visibility

public

Author

likeableemmec

Created

2024-01-08T17:57:04.978533Z

Updated

2024-01-10T16:32:30.375028Z

--[[
Sounds:
"Hurt" - "rbxassetid://6314900933"
"Slam" - "rbxassetid://3908308607"
]]

Folder0 = Instance.new("Folder")
Part1 = Instance.new("Part")
Part2 = Instance.new("Part")
Part3 = Instance.new("Part")
Part4 = Instance.new("Part")
Part5 = Instance.new("Part")
Part6 = Instance.new("Part")
Part7 = Instance.new("Part")
WedgePart8 = Instance.new("WedgePart")
Part9 = Instance.new("Part")
Part10 = Instance.new("Part")
Part11 = Instance.new("Part")
Part12 = Instance.new("Part")
Part13 = Instance.new("Part")
Part14 = Instance.new("Part")
Part15 = Instance.new("Part")
Part16 = Instance.new("Part")
Part17 = Instance.new("Part")
Decal18 = Instance.new("Decal")
Folder0.Name = "Map"
Folder0.Parent = owner.Character
Part1.Name = "BlueWall"
Part1.Parent = Folder0
Part1.CFrame = CFrame.new(-47.5, 0.5, -21.5, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part1.Orientation = Vector3.new(0, 90, 0)
Part1.Position = Vector3.new(-47.5, 0.5, -21.5)
Part1.Rotation = Vector3.new(0, 90, 0)
Part1.Color = Color3.new(0.0156863, 0.686275, 0.92549)
Part1.Size = Vector3.new(8, 1, 4)
Part1.Anchored = true
Part1.BottomSurface = Enum.SurfaceType.Smooth
Part1.BrickColor = BrickColor.new("Cyan")
Part1.TopSurface = Enum.SurfaceType.Smooth
Part1.brickColor = BrickColor.new("Cyan")
Part2.Name = "Cylinder"
Part2.Parent = Folder0
Part2.CFrame = CFrame.new(-25.5, 0.5, -2.5, 0, 0, -1, -1, 0, 0, 0, 1, 0)
Part2.Orientation = Vector3.new(0, -90, -90)
Part2.Position = Vector3.new(-25.5, 0.5, -2.5)
Part2.Rotation = Vector3.new(90, -90, 0)
Part2.Size = Vector3.new(1, 1, 1)
Part2.Anchored = true
Part2.BottomSurface = Enum.SurfaceType.Smooth
Part2.TopSurface = Enum.SurfaceType.Smooth
Part2.Shape = Enum.PartType.Cylinder
Part3.Name = "Cylinder"
Part3.Parent = Folder0
Part3.CFrame = CFrame.new(-45.4000015, 0.5, -8.60000038, 0, 0, -1, -1, 0, 0, 0, 1, 0)
Part3.Orientation = Vector3.new(0, -90, -90)
Part3.Position = Vector3.new(-45.400001525878906, 0.5, -8.600000381469727)
Part3.Rotation = Vector3.new(90, -90, 0)
Part3.Color = Color3.new(1, 0.34902, 0.34902)
Part3.Size = Vector3.new(1, 0.7999999523162842, 0.7999999523162842)
Part3.Anchored = true
Part3.BottomSurface = Enum.SurfaceType.Smooth
Part3.BrickColor = BrickColor.new("Persimmon")
Part3.TopSurface = Enum.SurfaceType.Smooth
Part3.brickColor = BrickColor.new("Persimmon")
Part3.Shape = Enum.PartType.Cylinder
Part4.Name = "RedWall"
Part4.Parent = Folder0
Part4.CFrame = CFrame.new(-33, 0.5, -15.5, 1, 0, 0, 0, 1, 0, 0, 0, 1)
Part4.Position = Vector3.new(-33, 0.5, -15.5)
Part4.Color = Color3.new(1, 0, 0)
Part4.Size = Vector3.new(8, 1, 1)
Part4.Anchored = true
Part4.BottomSurface = Enum.SurfaceType.Smooth
Part4.BrickColor = BrickColor.new("Really red")
Part4.TopSurface = Enum.SurfaceType.Smooth
Part4.brickColor = BrickColor.new("Really red")
Part5.Parent = Folder0
Part5.CFrame = CFrame.new(-42.5, 0.25, -10.8999996, 1, 0, 0, 0, 1, 0, 0, 0, 1)
Part5.Position = Vector3.new(-42.5, 0.25, -10.899999618530273)
Part5.Size = Vector3.new(3, 0.5, 0.19999998807907104)
Part5.Anchored = true
Part5.BottomSurface = Enum.SurfaceType.Smooth
Part5.TopSurface = Enum.SurfaceType.Smooth
Part6.Parent = Folder0
Part6.CFrame = CFrame.new(-25.8500004, 0.5, -8, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part6.Orientation = Vector3.new(0, 90, 0)
Part6.Position = Vector3.new(-25.850000381469727, 0.5, -8)
Part6.Rotation = Vector3.new(0, 90, 0)
Part6.Color = Color3.new(0.972549, 0.972549, 0.972549)
Part6.Size = Vector3.new(8, 1, 0.30000001192092896)
Part6.Anchored = true
Part6.BottomSurface = Enum.SurfaceType.Smooth
Part6.BrickColor = BrickColor.new("Institutional white")
Part6.TopSurface = Enum.SurfaceType.Smooth
Part6.brickColor = BrickColor.new("Institutional white")
Part7.Parent = Folder0
Part7.CFrame = CFrame.new(-24.6499996, 0.5, -8, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part7.Orientation = Vector3.new(0, 90, 0)
Part7.Position = Vector3.new(-24.649999618530273, 0.5, -8)
Part7.Rotation = Vector3.new(0, 90, 0)
Part7.Color = Color3.new(0.972549, 0.972549, 0.972549)
Part7.Size = Vector3.new(8, 1, 0.30000001192092896)
Part7.Anchored = true
Part7.BottomSurface = Enum.SurfaceType.Smooth
Part7.BrickColor = BrickColor.new("Institutional white")
Part7.TopSurface = Enum.SurfaceType.Smooth
Part7.brickColor = BrickColor.new("Institutional white")
WedgePart8.Parent = Folder0
WedgePart8.CFrame = CFrame.new(-50, 0.5, -7.5, 0, 0, -1, 1, 0, 0, 0, -1, 0)
WedgePart8.Orientation = Vector3.new(0, -90, 90)
WedgePart8.Position = Vector3.new(-50, 0.5, -7.5)
WedgePart8.Rotation = Vector3.new(-90, -90, 0)
WedgePart8.Size = Vector3.new(1, 1, 2)
WedgePart8.Anchored = true
WedgePart8.BottomSurface = Enum.SurfaceType.Smooth
Part9.Parent = Folder0
Part9.CFrame = CFrame.new(-71, 0.5, -17.5, -1, 0, 0, 0, 1, 0, 0, 0, -1)
Part9.Orientation = Vector3.new(0, 180, 0)
Part9.Position = Vector3.new(-71, 0.5, -17.5)
Part9.Rotation = Vector3.new(180, 0, 180)
Part9.Color = Color3.new(0.239216, 0.239216, 0.239216)
Part9.Size = Vector3.new(1, 1, 58)
Part9.Anchored = true
Part9.BottomSurface = Enum.SurfaceType.Smooth
Part9.BrickColor = BrickColor.new("Medium brown")
Part9.TopSurface = Enum.SurfaceType.Smooth
Part9.brickColor = BrickColor.new("Medium brown")
Part10.Parent = Folder0
Part10.CFrame = CFrame.new(-46, 0.5, 7.5, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part10.Orientation = Vector3.new(0, 90, 0)
Part10.Position = Vector3.new(-46, 0.5, 7.5)
Part10.Rotation = Vector3.new(0, 90, 0)
Part10.Color = Color3.new(0.2, 0.188235, 0.176471)
Part10.Size = Vector3.new(1, 1, 58)
Part10.Anchored = true
Part10.BottomSurface = Enum.SurfaceType.Smooth
Part10.BrickColor = BrickColor.new("Earth green")
Part10.TopSurface = Enum.SurfaceType.Smooth
Part10.brickColor = BrickColor.new("Earth green")
Part11.Name = "YellowWall"
Part11.Parent = Folder0
Part11.CFrame = CFrame.new(-38, 0.5, -25, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part11.Orientation = Vector3.new(0, 90, 0)
Part11.Position = Vector3.new(-38, 0.5, -25)
Part11.Rotation = Vector3.new(0, 90, 0)
Part11.Color = Color3.new(1, 1, 0)
Part11.Size = Vector3.new(4, 1, 4)
Part11.Anchored = true
Part11.BottomSurface = Enum.SurfaceType.Smooth
Part11.BrickColor = BrickColor.new("New Yeller")
Part11.TopSurface = Enum.SurfaceType.Smooth
Part11.brickColor = BrickColor.new("New Yeller")
Part12.Parent = Folder0
Part12.CFrame = CFrame.new(-52.8000031, 0.5, -12.5, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part12.Orientation = Vector3.new(0, 90, 0)
Part12.Position = Vector3.new(-52.80000305175781, 0.5, -12.5)
Part12.Rotation = Vector3.new(0, 90, 0)
Part12.Color = Color3.new(0.972549, 0.972549, 0.972549)
Part12.Size = Vector3.new(4, 1, 4)
Part12.Anchored = true
Part12.BottomSurface = Enum.SurfaceType.Smooth
Part12.BrickColor = BrickColor.new("Institutional white")
Part12.TopSurface = Enum.SurfaceType.Smooth
Part12.brickColor = BrickColor.new("Institutional white")
Part13.Parent = Folder0
Part13.CFrame = CFrame.new(-46, 0.5, -42.5, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part13.Orientation = Vector3.new(0, 90, 0)
Part13.Position = Vector3.new(-46, 0.5, -42.5)
Part13.Rotation = Vector3.new(0, 90, 0)
Part13.Color = Color3.new(0.239216, 0.239216, 0.239216)
Part13.Size = Vector3.new(1, 1, 58)
Part13.Anchored = true
Part13.BottomSurface = Enum.SurfaceType.Smooth
Part13.BrickColor = BrickColor.new("Medium brown")
Part13.TopSurface = Enum.SurfaceType.Smooth
Part13.brickColor = BrickColor.new("Medium brown")
Part14.Parent = Folder0
Part14.CFrame = CFrame.new(-30.5, 0.5, -0.5, 0, 0, 1, 0, 1, -0, -1, 0, 0)
Part14.Orientation = Vector3.new(0, 90, 0)
Part14.Position = Vector3.new(-30.5, 0.5, -0.5)
Part14.Rotation = Vector3.new(0, 90, 0)
Part14.Color = Color3.new(0.972549, 0.972549, 0.972549)
Part14.Size = Vector3.new(1, 1, 1)
Part14.Anchored = true
Part14.BottomSurface = Enum.SurfaceType.Smooth
Part14.BrickColor = BrickColor.new("Institutional white")
Part14.TopSurface = Enum.SurfaceType.Smooth
Part14.brickColor = BrickColor.new("Institutional white")
Part15.Parent = Folder0
Part15.CFrame = CFrame.new(-21, 0.5, -17.5, -1, 0, 0, 0, 1, 0, 0, 0, -1)
Part15.Orientation = Vector3.new(0, 180, 0)
Part15.Position = Vector3.new(-21, 0.5, -17.5)
Part15.Rotation = Vector3.new(180, 0, 180)
Part15.Color = Color3.new(0.239216, 0.239216, 0.239216)
Part15.Size = Vector3.new(1, 1, 58)
Part15.Anchored = true
Part15.BottomSurface = Enum.SurfaceType.Smooth
Part15.BrickColor = BrickColor.new("Medium brown")
Part15.TopSurface = Enum.SurfaceType.Smooth
Part15.brickColor = BrickColor.new("Medium brown")
Part16.Parent = Folder0
Part16.CFrame = CFrame.new(-42.5, 0.75, -10.8999996, 1, 0, 0, 0, 1, 0, 0, 0, 1)
Part16.Position = Vector3.new(-42.5, 0.75, -10.899999618530273)
Part16.Color = Color3.new(0.596078, 0.760784, 0.858824)
Part16.Size = Vector3.new(3, 0.5, 0.19999998807907104)
Part16.Anchored = true
Part16.BottomSurface = Enum.SurfaceType.Smooth
Part16.BrickColor = BrickColor.new("Baby blue")
Part16.TopSurface = Enum.SurfaceType.Smooth
Part16.brickColor = BrickColor.new("Baby blue")
Part17.Parent = owner.Character
Part17.CFrame = CFrame.new(-37, 0.5, -5.80000305, 1, 0, 0, 0, 1, 0, 0, 0, 1)
Part17.Position = Vector3.new(-37, 0.5, -5.8000030517578125)
Part17.Color = Color3.new(0,1,0)
Part17.Size = Vector3.new(1,1,1)
Part17.Anchored = true
Part17.BottomSurface = Enum.SurfaceType.Smooth
Part17.BrickColor = BrickColor.new("Lime green")
Part17.TopSurface = Enum.SurfaceType.Smooth
Part17.brickColor = BrickColor.new("Lime green")
Part17.Name = "PlayerCameraPart"
Decal18.Parent = Part17
Decal18.Name = "Face"
Decal18.Texture = "http://www.roblox.com/asset/?id=13449209"

for i, v in pairs(Folder0:GetDescendants()) do
	if v:IsA("BasePart") then
		local texture = Instance.new("ImageLabel")
		texture.Image = "rbxassetid://10043212933"
		texture.Name = "Texture"
		texture.Parent = v
	end
end
--local CameraCFrame = Instance.new("CFrameValue",owner.Character)
--CameraCFrame.Name = "CameraCFrame"
--CameraCFrame.Value = Part16.CFrame
--ClickDetector18.Parent = Folder0
--ClickDetector18.MouseClick:Connect(function(plr)
--	NLS([[
--	local controller
--	local cameracframe
--	for i, v in pairs(workspace:GetChildren()) do
--		if v:IsA("Model") then
--			if v:FindFirstChild("PlayerCameraPart") then
--				controller = v.PlayerCameraPart
--				cameracframe = v.CameraCFrame.Value
--			end
--		end
--	end
--	game:GetService("RunService").RenderStepped:Connect(function()
--		if controller and cameracframe then
--			cameracframe = controller.Parent.CameraCFrame.Value
--			controller.CFrame = cameracframe
--		end
--	end)
--	]],plr.Character)
--end)

--for i, v in pairs(Folder0:GetChildren()) do
--	if v:IsA("BasePart") then
--		v.CanCollide = false
--	end
--end

local Part19 = Part17:Clone()
Part19.Parent = Part17.Parent
Part19.Name = "ServerPart"
Part17.CanCollide = false
Part17.CanTouch = false
Part17.CanQuery = false
Part17.Transparency  = 1
Part17:FindFirstChildOfClass("Decal").Transparency = 1

Instance.new("RemoteEvent",owner.Character).OnServerEvent:Connect(function(_,cframe)
	--CameraCFrame.Value = cframe
	Part19.CFrame = cframe
end)

NLS([[

task.spawn(function()
	repeat workspace.CurrentCamera.CameraType = "Scriptable" task.wait() until workspace.CurrentCamera.CameraType == "Scriptable"
end)

ScreenGui0 = Instance.new("ScreenGui")
Frame1 = Instance.new("Frame")
Frame2 = Instance.new("Frame")
Frame3 = Instance.new("Frame")
Frame4 = Instance.new("Frame")
Frame5 = Instance.new("Frame")
Frame6 = Instance.new("Frame")
TextLabel7 = Instance.new("TextLabel")
ScreenGui0.Name = "RendererGui"
ScreenGui0.Parent = owner.PlayerGui
ScreenGui0.Enabled = false
ScreenGui0.IgnoreGuiInset = true
ScreenGui0.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
Frame1.Name = "MainFrame"
Frame1.Parent = ScreenGui0
Frame1.Size = UDim2.new(1, 0, 1, 0)
Frame1.BackgroundColor = BrickColor.new("Really black")
Frame1.BackgroundColor3 = Color3.new(0, 0, 0)
Frame1.BorderSizePixel = 0
Frame2.Name = "Background"
Frame2.Parent = Frame1
Frame2.Position = UDim2.new(0.5, 0, 0.5, 0)
Frame2.Size = UDim2.new(1, 0, 1, 0)
Frame2.AnchorPoint = Vector2.new(0.5, 0.5)
Frame2.BackgroundColor = BrickColor.new("Institutional white")
Frame2.BackgroundColor3 = Color3.new(1, 1, 1)
Frame2.BackgroundTransparency = 1
Frame2.BorderSizePixel = 0
Frame2.ClipsDescendants = true
Frame2.SizeConstraint = Enum.SizeConstraint.RelativeYY
Frame3.Name = "Floor"
Frame3.Parent = Frame2
Frame3.Position = UDim2.new(0, 0, 0.5, 0)
Frame3.Size = UDim2.new(1, 0, 0.5, 0)
Frame3.BackgroundColor = BrickColor.new("Reddish brown")
Frame3.BackgroundColor3 = Color3.new(0.403922, 0.258824, 0.0901961)
Frame3.BorderSizePixel = 0
Frame4.Name = "Ceiling"
Frame4.Parent = Frame2
Frame4.Size = UDim2.new(1, 0, 0.5, 0)
Frame4.BackgroundColor = BrickColor.new("Dark taupe")
Frame4.BackgroundColor3 = Color3.new(0.298039, 0.298039, 0.298039)
Frame4.BorderSizePixel = 0
Frame5.Name = "Canvas"
Frame5.Parent = Frame1
Frame5.Position = UDim2.new(0.5, 0, 0.5, 0)
Frame5.Size = UDim2.new(1, 0, 1, 0)
Frame5.AnchorPoint = Vector2.new(0.5, 0.5)
Frame5.BackgroundColor = BrickColor.new("Institutional white")
Frame5.BackgroundColor3 = Color3.new(1, 1, 1)
Frame5.BackgroundTransparency = 1
Frame5.BorderSizePixel = 0
Frame5.ClipsDescendants = true
Frame5.SizeConstraint = Enum.SizeConstraint.RelativeYY
Frame5.ZIndex = 2
Frame6.Name = "Disclaimer"
Frame6.Parent = ScreenGui0
Frame6.Size = UDim2.new(1,0,1,0)
Frame6.BackgroundColor3 = Color3.fromRGB(50,50,50)
Frame6.BorderSizePixel = 0
Frame6.ZIndex = 999
TextLabel7.Name = "DisclaimerTxt"
TextLabel7.Size = UDim2.fromScale(1,.5)
TextLabel7.AnchorPoint = Vector2.new(.5,.5)
TextLabel7.Position = UDim2.fromScale(.5,.5)
TextLabel7.BackgroundTransparency = 1
TextLabel7.FontFace = Font.fromName("GothamBlack",Enum.FontWeight.Bold,Enum.FontStyle.Normal)
TextLabel7.Text = "This project is recreating the original DOOM. It is nowhere near 1:1, it's more 0.1:1. Base raycaster made by Ethanthegrand14. Copyright info: DOOM®© 1993-2023 id Software LLC, a ZeniMax Media company. DOOM, id, id Software, id Tech and related logos are registered trademarks or trademarks of the id Software LLC in the U.S. and/or other countries. Bethesda, Bethesda Softworks, ZeniMax and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the U.S. and/or other countries. Nerve is a trademark of Nerve Software LLC. All Rights Reserved."
TextLabel7.TextColor3 = Color3.fromRGB(150,150,150)
TextLabel7.TextScaled = true
TextLabel7.Parent = Frame6

local Gui = ScreenGui0

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

local LocalPlayer = Players.LocalPlayer

repeat task.wait() until LocalPlayer.Character
local Character = LocalPlayer.Character
local Humanoid = Character:WaitForChild("Humanoid")

-- Camera
CameraPart = owner.Character:WaitForChild("PlayerCameraPart") -- The player's camera
FieldOfView = 50
RenderDistance = 100 -- How far the game will render your world
CameraHeight = 0.5 -- Shifts the camera up the Y axis (0-1)

-- Picture	
Resolution = 70 -- The amount of columns and rays that will be used
ObjectHeightMultiplier = 1 -- Extra height for walls and sprites

-- Graphics
ShadingLevel = 2 --  Setting this below 1 will brighten certain faces. And setting above 1 will darken certain faces. 1 is no shading

-- Player
DisableRobloxAvatarMovement = true -- Disabled movement from user's roblox characters
PlayerCollisionsEnabled = true -- Enabled collision for the CameraPart
PlayerWalkSpeed = 5
PlayerTurnSpeed = 3

local LevelWorkspace = owner.Character.Map

local PlayerWalkSpeedPerSecond = PlayerWalkSpeed
local PlayerTurnSpeedPerSecond = PlayerTurnSpeed
local DisablePlayerMovement = true
local PlayerCollisionsEnabled = true

local KeysBeingPressed = {
	Up = false,
	Left = false,
	Down = false,
	Right = false,
}

--if CameraPart.Parent:FindFirstChild("ServerPart") then
--	CameraPart.Parent.ServerPart.Transparency = 1
--end

-- Collision

local function CheckForWall(RayLength)
	local Params = RaycastParams.new()
	Params.FilterType = Enum.RaycastFilterType.Include
	Params.FilterDescendantsInstances = LevelWorkspace:GetChildren()

	local ViewRayOrigin = CameraPart.Position
	local ViewRayDirection = CameraPart.CFrame.LookVector * RayLength

	local ViewRay = workspace:Raycast(ViewRayOrigin, ViewRayDirection, Params)
	if ViewRay and ViewRay.Instance and ViewRay.Instance:IsA("BasePart") and ViewRay.Instance.CanCollide and PlayerCollisionsEnabled then
		local HitPart = ViewRay.Instance
		return true
	else
		return false
	end
end


-- Movement

local function WalkForwards(deltaTime)
	local deltaSpeed = deltaTime * PlayerWalkSpeedPerSecond
	
	if not CheckForWall(1) then
		CameraPart.CFrame = CameraPart.CFrame * CFrame.new(0, 0, -deltaSpeed)
		owner.Character.RemoteEvent:FireServer(CameraPart.CFrame)
	end
end

local function TurnLeft(deltaTime)
	local deltaSpeed = deltaTime * PlayerTurnSpeedPerSecond
	
	CameraPart.CFrame = CameraPart.CFrame * CFrame.Angles(0, deltaSpeed, 0)
	owner.Character.RemoteEvent:FireServer(CameraPart.CFrame)
end

local function WalkBackwards(deltaTime)
	local deltaSpeed = deltaTime * PlayerWalkSpeedPerSecond
	
	if not CheckForWall(-1) then
		CameraPart.CFrame = CameraPart.CFrame * CFrame.new(0, 0, deltaSpeed)
		owner.Character.RemoteEvent:FireServer(CameraPart.CFrame)
	end
end

local function TurnRight(deltaTime)
	local deltaSpeed = deltaTime * PlayerTurnSpeedPerSecond
	
	CameraPart.CFrame = CameraPart.CFrame * CFrame.Angles(0, -deltaSpeed, 0)
	owner.Character.RemoteEvent:FireServer(CameraPart.CFrame)
end


-- Get inputs

UIS.InputBegan:Connect(function(Input, GPE)
	if GPE then return end
	if Input.KeyCode == Enum.KeyCode.W or Input.KeyCode == Enum.KeyCode.Up or Input.KeyCode == Enum.KeyCode.DPadUp then
		KeysBeingPressed[1] = true
	end
	if Input.KeyCode == Enum.KeyCode.A or Input.KeyCode == Enum.KeyCode.Left or Input.KeyCode == Enum.KeyCode.DPadLeft then
		KeysBeingPressed[2] = true
	end
	if Input.KeyCode == Enum.KeyCode.S or Input.KeyCode == Enum.KeyCode.Down or Input.KeyCode == Enum.KeyCode.DPadDown then
		KeysBeingPressed[3] = true
	end
	if Input.KeyCode == Enum.KeyCode.D or Input.KeyCode == Enum.KeyCode.Right or Input.KeyCode == Enum.KeyCode.DPadRight then
		KeysBeingPressed[4] = true
	end
	if Input.KeyCode == Enum.KeyCode.Comma then
		if Frame6 then
			Frame6:Destroy()
		end
	end
end)
UIS.InputEnded:Connect(function(Input, GPE)
	if Input.KeyCode == Enum.KeyCode.W or Input.KeyCode == Enum.KeyCode.Up or Input.KeyCode == Enum.KeyCode.DPadUp then
		KeysBeingPressed[1] = false
	end
	if Input.KeyCode == Enum.KeyCode.A or Input.KeyCode == Enum.KeyCode.Left or Input.KeyCode == Enum.KeyCode.DPadLeft then
		KeysBeingPressed[2] = false
	end
	if Input.KeyCode == Enum.KeyCode.S or Input.KeyCode == Enum.KeyCode.Down or Input.KeyCode == Enum.KeyCode.DPadDown then
		KeysBeingPressed[3] = false
	end
	if Input.KeyCode == Enum.KeyCode.D or Input.KeyCode == Enum.KeyCode.Right or Input.KeyCode == Enum.KeyCode.DPadRight then
		KeysBeingPressed[4] = false
	end
end)


-- Disabled roblox player movement

if DisablePlayerMovement then
	Humanoid.JumpPower = 0
	Humanoid.WalkSpeed = 0
end

-- Main loop

local function onRenderStep(deltaTime) -- deltaTime so that the player's walkspeed isn't affected from their FPS
	if KeysBeingPressed[1] then -- Walk forwards
		WalkForwards(deltaTime)
	end
	if KeysBeingPressed[2] then -- Turn left
		TurnLeft(deltaTime)
	end
	if KeysBeingPressed[3] then -- Walk backwards
		WalkBackwards(deltaTime)
	end
	if KeysBeingPressed[4] then -- Turn right
		TurnRight(deltaTime)
	end
end

RS.RenderStepped:Connect(onRenderStep)

local Canvas = Frame1:WaitForChild("Canvas")

local RS = game:GetService("RunService")

local CameraPart = CameraPart

local FrameSizeX = (1 / Resolution)

local SpritesTable = {}

local function GenerateFrames() 
	-- Generate columns
	for i = 1, Resolution do
		local FramePosX = 1 / Resolution * (i - 1)

		-- Main column
		local Frame = Instance.new("Frame")
		Frame.ClipsDescendants = true
		Frame.LayoutOrder = i
		Frame.Name = "Frame" .. i
		Frame.BorderSizePixel = 0
		Frame.AnchorPoint = Vector2.new(0, CameraHeight)
		Frame.Size = UDim2.fromScale(FrameSizeX, 0)
		Frame.Position = UDim2.fromScale(FramePosX, 0.5)
		
		--local ImageLabel = Instance.new("ImageLabel")
		--ImageLabel.Size = UDim2.fromScale(1,1)
		--ImageLabel.LayoutOrder = i
		--ImageLabel.Name = "ImageFrame"
		--ImageLabel.BorderSizePixel = 0

		Frame.Parent = Canvas
		--ImageLabel.Parent = Frame
	end

end

local function ClearCanvas() -- Clears any old frames
	Canvas:ClearAllChildren()
end

function NormalToFace(normalVector, part)

	local function GetNormalFromFace(part, normalId)
		return part.CFrame:VectorToWorldSpace(Vector3.FromNormalId(normalId))
	end

	local TOLERANCE_VALUE = 1 - 0.001
	local allFaceNormalIds = {
		Enum.NormalId.Front,
		Enum.NormalId.Back,
		Enum.NormalId.Bottom,
		Enum.NormalId.Top,
		Enum.NormalId.Left,
		Enum.NormalId.Right
	}    

	for _, normalId in pairs(allFaceNormalIds) do
		-- If the two vectors are almost parallel,
		if GetNormalFromFace(part, normalId):Dot(normalVector) > TOLERANCE_VALUE then
			return normalId -- We found it!
		end
	end

	return nil -- None found within tolerance.

end

local function UpdateFrames() -- Render the picture
	local Count = -Resolution / 2

	-- Frames
	for i, Frame in ipairs(Canvas:GetChildren()) do
		if Frame:IsA("Frame") then

			local Params = RaycastParams.new()
			Params.FilterType = Enum.RaycastFilterType.Include
			Params.FilterDescendantsInstances = LevelWorkspace:GetChildren()

			local ViewRayOrigin = CameraPart.Position
			local RayAngle = CFrame.Angles(0, -math.rad((Count * FieldOfView) / Resolution), 0)
			local ViewRayDirection = (CameraPart.CFrame * RayAngle).LookVector * RenderDistance

			local ViewRay = workspace:Raycast(ViewRayOrigin, ViewRayDirection, Params)
			if ViewRay and ViewRay.Instance and ViewRay.Instance:IsA("BasePart") and ViewRay.Instance.Transparency < 1 then
				local HitPart = ViewRay.Instance
				--print(ViewRay.Instance)
				--print(ViewRay.Position)

				--if HitPart:FindFirstChild("Texture") and HitPart.Texture:IsA("ImageLabel") and TexturesEnabled then
				--	if Frame.ImageFrame.Image ~= HitPart.Texture.Image then
				--		-- Implement image for texturing
				--		Frame.ImageFrame.Image = HitPart.Texture.Image
				--	end
				--elseif TexturesEnabled then
				--	Frame.ImageFrame.Image = "" 
				--end
				
				-- divide by cos(angle of ray - viewAngle) and use that as the distance

				local RayAngleX, RayAngleY, RayAngleZ = RayAngle:ToEulerAnglesXYZ() -- RayAngle is a CFrame value
				local Distance = ((ViewRayOrigin - ViewRay.Position).Magnitude) * math.cos(RayAngleY)

				Frame.Size = UDim2.fromScale(FrameSizeX, (1 / Distance) * ObjectHeightMultiplier)

				-- Shading

				local Face = NormalToFace(ViewRay.Normal, HitPart)

				if Face == Enum.NormalId.Right or Face == Enum.NormalId.Left then
					Frame.BackgroundColor3 = Color3.new(HitPart.Color.R / ShadingLevel, HitPart.Color.G / ShadingLevel, HitPart.Color.B / ShadingLevel)
				else
					Frame.BackgroundColor3 = HitPart.Color
				end


				-- Debug

				--local DebugLaser = Instance.new("Part") -- Visualise the rays
				--DebugLaser.Anchored = true
				--DebugLaser.Name = "DebugLaser"
				--DebugLaser.Size = Vector3.new(0.2, 0.2, Distance)
				--DebugLaser.CFrame = CFrame.new(ViewRayOrigin, ViewRay.Position) * CFrame.new(0, 0, -Distance/2)
				--DebugLaser.Parent = workspace

			else
				Frame.BackgroundTransparency = 1
			end

			Count = Count + 1

		end
	end

end

ClearCanvas() -- Just incase.

GenerateFrames() -- Generate all the columns that will be used.

UpdateFrames()

ScreenGui0.Enabled = true

RS.RenderStepped:Connect(function() -- Always render the picture
	UpdateFrames()
end)

local Sound = Instance.new("Sound")
Sound.SoundId = "rbxassetid://3908308607"
Sound.PlayOnRemove = true
Sound.Parent = Frame6
Sound:Play()

task.wait(7.5)

if Frame6 then
	Frame6:Destroy()
end

-- Made by LikeableEmmec and man who would like to be stricken from the record (not Ethanthegrand14) (fr tho ethanthegrand truly is very grand)
]],owner.Character)
INFO