View difference between Paste ID: qQCbVUDj and 0aBYjjdx
SHOW: | | - or go back to the newest paste.
1-
Player = game:GetService("Players").andrewengen1
1+
Player = game:GetService("Players").mikee112
2
Button1Down = false
3
4
5
function CalculateReflection(PointA, PointB, Hit, Distance)
6
	local Offset = Hit.CFrame:toObjectSpace(CFrame.new(PointB)).p
7
	local Face = nil
8
	local Largest = "x"
9
	if math.abs(Offset.y / Hit.Size.y) > math.abs(Offset.x / Hit.Size.x) then
10
		Largest = "y"
11
	end
12
	if math.abs(Offset.z / Hit.Size.z) > math.abs(Offset[Largest] / Hit.Size[Largest]) then
13
		Largest = "z"
14
	end
15
	if Offset[Largest] < 0 then
16
		if Largest == "x" then
17
			Face = "Left"
18
		elseif Largest == "y" then
19
			Face = "Bottom"
20
		elseif Largest == "z" then
21
			Face = "Back"
22
		end
23
	else
24
		if Largest == "x" then
25
			Face = "Right"
26
		elseif Largest == "y" then
27
			Face = "Top"
28
		elseif Largest == "z" then
29
			Face = "Front"
30
		end
31
	end
32
	local X, Y = CFrame.new(PointA, PointB):toEulerAnglesXYZ() --Vector3.new(Hit.CFrame:toEulerAnglesXYZ()).y???
33
	if Face == Enum.NormalId.Left.Name or Face == Enum.NormalId.Right.Name then
34
		return CFrame.new(PointB) * CFrame.fromEulerAnglesXYZ(X + math.rad(180), Y, 0)
35
	elseif Face == Enum.NormalId.Bottom.Name or Face == Enum.NormalId.Top.Name then
36
		return CFrame.new(PointB) * CFrame.fromEulerAnglesXYZ(-X + math.rad(180), -Y, 0)
37
	elseif Face == Enum.NormalId.Front.Name or Face == Enum.NormalId.Back.Name then
38
		return CFrame.new(PointB) * CFrame.fromEulerAnglesXYZ(-X, -Y, 0)
39
	end
40
end
41
42
43
function onSelected(Mouse)
44
	Mouse.Button1Down:connect(function()
45
		Button1Down = true
46
		while Button1Down do
47
			for _, Part in pairs(Player.Character:GetChildren()) do
48
				if Part.Name == "RayPart" then
49
					Part:Remove()
50
				end
51
			end
52
			local PointA = Player.Character.Torso.CFrame.p
53
			local PointB = Mouse.Hit.p
54
			for i = 1, 50 do
55
				local Ray = Ray.new((CFrame.new(PointA, PointB) * CFrame.new(0, 0, -0.1)).p, (PointB - PointA).unit * 300)
56
				local Hit, Position = game.Workspace:FindPartOnRay(Ray, Player.Character)
57
				local RayPart = Instance.new("Part", Player.Character)
58
				RayPart.Name = "RayPart"
59
				RayPart.BrickColor = BrickColor.new("Bright red")
60
				RayPart.Transparency = 0.5
61
				RayPart.Anchored = true
62
				RayPart.CanCollide = false
63
				RayPart.TopSurface = Enum.SurfaceType.Smooth
64
				RayPart.BottomSurface = Enum.SurfaceType.Smooth
65
				RayPart.FormFactor = Enum.FormFactor.Custom
66
				local Distance = (Position - PointA).magnitude
67
				RayPart.Size = Vector3.new(0.2, 0.2, Distance)
68
				RayPart.CFrame = CFrame.new(PointA, Position) * CFrame.new(0, 0, -Distance / 2)
69
				if Hit ~= nil then
70
					PointB = (CalculateReflection(PointA, Position, Hit, Distance) * CFrame.new(0, 0, 1)).p
71
					PointA = Position
72
				else
73
					break
74
				end
75
			end
76
			wait()
77
		end
78
	end)
79
	Mouse.Button1Up:connect(function()
80
		Button1Down = false
81
	end)
82
end
83
84
85
if script.Parent.ClassName ~= "HopperBin" then
86
	if Player == nil then print("Error: Player not found!") return end
87
	Tool = Instance.new("HopperBin")
88
	Tool.Name = "Laser"
89
	Tool.Parent = Player.Backpack
90
	script.Name = "Main"
91
	script.Parent = Tool
92
elseif script.Parent.ClassName == "HopperBin" then
93
	Player = script.Parent.Parent.Parent
94
	script.Parent.Selected:connect(onSelected)
95
	--script.Parent.Deselected:connect(onDeselected)
96
end