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 |