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 |