diff --git a/Core.lua b/Core.lua index 6121b4b..6803be3 100644 --- a/Core.lua +++ b/Core.lua @@ -186,6 +186,7 @@ function Enable(Mouse) EnableHotkeys(); Targeting.EnableTargeting(); Selection.EnableOutlines(); + Selection.EnableMultiselectionHotkeys(); -- Equip current tool EquipTool(CurrentTool or require(Tool.Tools.MoveTool)); @@ -304,6 +305,14 @@ AssignHotkey({ 'RightShift', 'Z' }, History.Undo); AssignHotkey({ 'LeftShift', 'Y' }, History.Redo); AssignHotkey({ 'RightShift', 'Y' }, History.Redo); +-- If in-game, enable ctrl hotkeys for undoing and redoing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'Z' }, History.Undo); + AssignHotkey({ 'RightControl', 'Z' }, History.Undo); + AssignHotkey({ 'LeftControl', 'Y' }, History.Redo); + AssignHotkey({ 'RightControl', 'Y' }, History.Redo); +end; + function CloneSelection() -- Clones selected parts @@ -414,6 +423,14 @@ AssignHotkey({ 'RightShift', 'C' }, CloneSelection); AssignHotkey({ 'LeftShift', 'X' }, DeleteSelection); AssignHotkey({ 'RightShift', 'X' }, DeleteSelection); +-- If in-game, enable ctrl hotkeys for cloning and deleting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'C' }, CloneSelection); + AssignHotkey({ 'RightControl', 'C' }, CloneSelection); + AssignHotkey({ 'LeftControl', 'X' }, DeleteSelection); + AssignHotkey({ 'RightControl', 'X' }, DeleteSelection); +end; + function PrismSelect() -- Selects parts in the currently selected parts @@ -465,6 +482,12 @@ end; AssignHotkey({ 'LeftShift', 'K' }, PrismSelect); AssignHotkey({ 'RightShift', 'K' }, PrismSelect); +-- If in-game, enable ctrl hotkeys for prism selection +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'K' }, PrismSelect); + AssignHotkey({ 'RightControl', 'K' }, PrismSelect); +end; + function SelectSiblings(ReplaceSelection) -- Selects all parts under the same parent as the focused part @@ -494,6 +517,14 @@ AssignHotkey({ 'RightShift', 'LeftBracket' }, Support.Call(SelectSiblings, false AssignHotkey({ 'LeftShift', 'R' }, Support.Call(Selection.Clear, true)); AssignHotkey({ 'RightShift', 'R' }, Support.Call(Selection.Clear, true)); +-- If in-game, enable ctrl hotkeys for sibling selection & selection clearing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'RightControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'LeftControl', 'R' }, Support.Call(Selection.Clear, true)); + AssignHotkey({ 'RightControl', 'R' }, Support.Call(Selection.Clear, true)); +end; + function IsSelectable(Object) -- Returns whether `Object` can be selected @@ -563,6 +594,12 @@ end; AssignHotkey({ 'LeftShift', 'P' }, ExportSelection); AssignHotkey({ 'RightShift', 'P' }, ExportSelection); +-- If in-game, enable ctrl hotkeys for exporting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'P' }, ExportSelection); + AssignHotkey({ 'RightControl', 'P' }, ExportSelection); +end; + function IsVersionOutdated() -- Returns whether this version of Building Tools is out of date diff --git a/SelectionModule.lua b/SelectionModule.lua index c73043e..ed5596c 100644 --- a/SelectionModule.lua +++ b/SelectionModule.lua @@ -8,6 +8,7 @@ Selection = {}; Selection.Items = {}; Selection.Outlines = {}; Selection.Color = BrickColor.new 'Cyan'; +Selection.Multiselecting = false; -- Events to listen to selection changes Selection.ItemsAdded = RbxUtility.CreateSignal(); @@ -278,6 +279,42 @@ function Selection.EnableOutlines() end; +function Selection.EnableMultiselectionHotkeys() + -- Enables hotkeys for multiselecting + + -- Determine multiselection hotkeys + local Hotkeys = Support.FlipTable { 'LeftShift', 'RightShift', 'LeftControl', 'RightControl' }; + + -- Get core API + local Core = GetCore(); + + -- Listen for matching key presses + Core.Connections.MultiselectionHotkeys = Support.AddUserInputListener('Began', 'Keyboard', false, function (Input) + if Hotkeys[Input.KeyCode.Name] then + Selection.Multiselecting = true; + end; + end); + + -- Listen for matching key releases + Core.Connections.MultiselectingReleaseHotkeys = Support.AddUserInputListener('Ended', 'Keyboard', true, function (Input) + + -- Get currently pressed keys + local PressedKeys = Support.GetListMembers(Support.GetListMembers(Game:GetService('UserInputService'):GetKeysPressed(), 'KeyCode'), 'Name'); + + -- Continue multiselection if a hotkey is still pressed + for _, PressedKey in pairs(PressedKeys) do + if Hotkeys[PressedKey] then + return; + end; + end; + + -- Disable multiselection if matching key not found + Selection.Multiselecting = false; + + end); + +end; + function Selection.HideOutlines() -- Hides selection outlines diff --git a/SnapTracking.lua b/SnapTracking.lua index b79dcfd..c05d3dd 100644 --- a/SnapTracking.lua +++ b/SnapTracking.lua @@ -212,6 +212,17 @@ end; function SnapTracking.StopTracking() -- Stops tracking the current closest snapping point, cleans up + -- Clear the previous tracking target, and callback + SnapTracking.Target = nil; + SnapTracking.Callback = nil; + + -- Reset snapping point options + SnapTracking.TrackFaceCentroids = true; + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackCorners = true; + SnapTracking.TargetFilter = nil; + SnapTracking.TargetBlacklist = {}; + -- Make sure we're currently tracking if not SnapTracking.Enabled then return; @@ -224,18 +235,6 @@ function SnapTracking.StopTracking() -- Clear the point marker UI from the screen SnapTracking.ClearUI(); - -- Clear the previous tracking target, and callback - SnapTracking.Target = nil; - SnapTracking.Callback = nil; - - -- Reset snapping point options - SnapTracking.TrackFaceCentroids = true; - SnapTracking.TrackEdgeMidpoints = true; - SnapTracking.TrackCorners = true; - - SnapTracking.TargetFilter = nil; - SnapTracking.TargetBlacklist = {}; - -- Indicate that tracking is no longer enabled SnapTracking.Enabled = false; diff --git a/SyncAPI.lua b/SyncAPI.lua index a2c9cc7..1f785b9 100644 --- a/SyncAPI.lua +++ b/SyncAPI.lua @@ -43,10 +43,8 @@ Actions = { -- Clones the given parts -- Make sure the given items are all parts - for _, Part in pairs(Parts) do - if not Part:IsA 'BasePart' then - return; - end; + if not ArePartsSelectable(Parts) then + return; end; -- Cache up permissions for all private areas @@ -126,6 +124,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -173,6 +176,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -209,6 +217,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -269,6 +282,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -331,6 +349,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -391,6 +414,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -433,6 +461,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -472,6 +505,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -527,6 +565,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -597,6 +640,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -652,6 +700,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -725,6 +778,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -772,6 +830,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -834,6 +897,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -890,6 +958,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -953,6 +1026,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -987,6 +1065,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1021,6 +1104,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1055,6 +1143,11 @@ Actions = { ['CreateWelds'] = function (Parts, TargetPart) -- Creates welds for the given parts to the target part + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1113,6 +1206,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + local WeldsRemoved = 0; -- Cache up permissions for all private areas @@ -1168,6 +1266,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1213,6 +1316,11 @@ Actions = { return; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1312,6 +1420,42 @@ Actions = { }; +function ArePartsSelectable(Parts) + -- Returns whether the parts are selectable + + -- Check whether each part is selectable + for _, Part in pairs(Parts) do + if not Part:IsA 'BasePart' or Part.Locked then + return false; + end; + end; + + -- Return true if all parts are selectable + return true; + +end; + +-- Keep current player updated in tool mode +if ToolMode == 'Tool' then + + -- Set current player + Player = Players:GetPlayerFromCharacter(Tool.Parent); + + -- Stay updated with latest player operating the tool + Tool.AncestryChanged:Connect(function (Child, Parent) + + -- Ensure tool's parent changed + if Child ~= Tool then + return; + end; + + -- Update current player + Player = Players:GetPlayerFromCharacter(Parent); + + end); + +end; + -- Provide an interface into the module return { @@ -1327,8 +1471,10 @@ return { return; end; - -- Update the Player pointer - Player = Client; + -- Ensure client is current player in tool mode + if ToolMode == 'Tool' then + assert(Player and (Client == Player), 'Permission denied for client'); + end; -- Execute valid actions return Action(...); diff --git a/TargetingModule.lua b/TargetingModule.lua index 860f935..ef0e8ec 100644 --- a/TargetingModule.lua +++ b/TargetingModule.lua @@ -66,9 +66,6 @@ end; function TargetingModule.SelectTarget() - -- Check if shift is held - local ShiftHeld = Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift); - -- Ensure target selection isn't cancelled if SelectionCancelled then SelectionCancelled = false; @@ -76,7 +73,7 @@ function TargetingModule.SelectTarget() end; -- Focus on clicked, selected item - if not ShiftHeld and Selection.Find(Target) then + if not Selection.Multiselecting and Selection.Find(Target) then Selection.SetFocus(Target); return; end; @@ -87,17 +84,17 @@ function TargetingModule.SelectTarget() return; end; - -- Unselect clicked, selected item if shift is held - if ShiftHeld and Selection.Find(Target) then + -- Unselect clicked, selected item if multiselection is enabled + if Selection.Multiselecting and Selection.Find(Target) then Selection.Remove({ Target }, true); return; end; - -- Add to selection if shift is held - if ShiftHeld then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add({ Target }, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace({ Target }, true); end; @@ -231,11 +228,11 @@ function TargetingModule.FinishRectangleSelecting() end; end; - -- Add to selection if shift is held - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add(SelectableItems, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace(SelectableItems, true); end; diff --git a/build/Building Tools by F3X (plugin).rbxmx b/build/Building Tools by F3X (plugin).rbxmx index f1f478e..6d5142c 100644 --- a/build/Building Tools by F3X (plugin).rbxmx +++ b/build/Building Tools by F3X (plugin).rbxmx @@ -1,11 +1,11 @@ null nil - + Building Tools by F3X - + false -0.5 @@ -76,7 +76,7 @@ 0.800000012 - + 4294967295 5 @@ -85,7 +85,7 @@ 0 - + 4294967295 2 @@ -94,7 +94,7 @@ 0 - + 4294967295 3 @@ -103,7 +103,7 @@ 0 - + 4294967295 0 @@ -112,7 +112,7 @@ 0 - + 4294967295 1 @@ -121,7 +121,7 @@ 0 - + 4294967295 4 @@ -131,17 +131,17 @@ - + Version - 2.0.1 + 2.0.2 - + SupportLibrary - {AF627CE6-3567-4B19-9CF5-F9C8CC50C418} + {276F344C-469D-449C-A433-FBB18E3B8592} - + SecurityModule - {76D5254D-1B8B-4F38-BB29-0EC26AF3AA53} + {4E96BCE7-DB08-47A6-A42B-4833931B2534} - + Region by AxisAngle - {BEC01F60-B2C1-4440-9F13-256054C7BCB5} + {89D34A64-F5F0-4495-B701-DFE9DF5DF47F} - + false @@ -1818,11 +1818,11 @@ end; -- Expose GetLibraries function _G.GetLibraries = GetLibraries;]]> - + F3X/SupportLibrary@1.0.0 - {1BFC3C3C-D06F-4B5C-B79D-70FF6735DB05} + {3828CCBC-611C-4CF0-B73C-54AAC681E6BF} - + Metadata - {BF155B56-AE7D-4141-95CC-6A0406FB470B} + {AC4DF028-750A-4E46-8C20-211ABC74B847} - + F3X/Cheer@0.0.1 - {98A4ED7A-8D23-4CC2-B199-CBDFD6FF8F8E} + {16EFB4A5-2040-4B3A-80D3-241B3559EDD2} - + SupportLibrary - {0B356333-F133-4A5C-A3DB-ADE5E8F1CB44} + {F44136EB-B2E1-421E-9BD5-0D84C8A96319} - + Metadata - {07F16FB1-2B62-4ACA-B1FF-DE8D5DBF710C} + {6D285C58-D789-4B70-9DC4-5C0A69C25364} - + F3X/Try@1.0.0 - {1BBDA9BF-F632-4F2D-8989-662255D82D8E} + {7803A1CF-A0BD-44FB-8D3C-6197C12C636A} - + SupportLibrary @@ -5232,11 +5232,11 @@ end; return SupportLibrary;]]> - + Metadata - {52186982-44A5-4662-942E-26B8CCED7DA6} + {E3EA7C7A-3B45-486A-BDA8-BC9544AB6DD6} - + SerializationModule - {D163F155-7BCD-4459-B9C8-5BB9ACFEECBD} + {1ECE6BA9-B787-4C56-A8E8-628058296208} - + SyncAPI - + SyncModule - {49365CC0-6516-4C49-9260-E2110558F236} + {EC0655C1-19C5-46D5-80C5-022FCDCEA683} - + ServerEndpoint - + false ServerEndpointScript - {4B29E480-CBE5-4E88-A026-FCAAD6F2E57D} + {F6CFC9BD-5C68-4659-9451-4B5E8FAB5C2C} - + false @@ -7103,22 +7249,22 @@ end;]]> - + Loaded false - + ComponentCount 0 - + false ComponentCounter - {A6B5CC4F-EB25-4EEF-8CD5-9E2608E6B9D2} + {EDDC90CF-4D08-424E-A71E-DB82F6D5733E}

- + false @@ -7156,11 +7302,11 @@ Indicator.Value = true;]]> - + Assets - + {FA84AA5E-2C4A-4101-A9CA-8C71F770285B} return Assets;]]> - + Core - {958EE6C4-B502-4727-8B0E-C16FDB0960C0} + {6B760565-60C5-48B3-A318-D45F5FC82581} - + false @@ -7865,15 +8048,15 @@ local Core = require(Tool:WaitForChild 'Core'); require(Tool.Tools.CoreToolLoader);]]> - + Tools - + MoveTool - {BA9280AF-0194-4E51-BBFC-54865E1DDBF6} + {80377989-C9D8-4BF7-9CA7-D00D66BD7980} - + ResizeTool - {F0B36D21-330E-4356-BA8F-EFE7B3932638} + {EF60C14F-E6FD-43A5-8D4C-45E623CB66C0} 0) and (DragAngle - 360) or DragAngle; -- Go through corner offsets representing the possible directions local Directions = {}; for _, Direction in pairs(SnappingStartDirections) do -- Map the corner & corner offset to screen points - local ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); local ScreenOffsetPoint = Workspace.CurrentCamera:WorldToScreenPoint(Direction.Offset); - -- Get the slope representing the direction (based on the mapped screen points) - local DirectionSlope = (ScreenOffsetPoint.Y - ScreenSnappedPoint.Y) / (ScreenOffsetPoint.X - ScreenSnappedPoint.X); + -- Get direction angle from snap point + local DirectionAngle = math.deg(math.atan2(ScreenOffsetPoint.Y - ScreenSnappedPoint.Y, ScreenOffsetPoint.X - ScreenSnappedPoint.X)); + DirectionAngle = (DirectionAngle > 0) and (DirectionAngle - 360) or DirectionAngle; - -- Calculate the similarity between the drag & direction slopes - local SlopeDelta = math.abs(math.abs(DragSlope) - math.abs(DirectionSlope)); - table.insert(Directions, { Face = Direction.Face, SlopeDelta = SlopeDelta, Offset = Direction.Offset }); + -- Calculate delta between drag and direction angles + local AngleDelta = math.abs(DragAngle - DirectionAngle) % 180; + AngleDelta = (AngleDelta > 90) and (180 - AngleDelta) or AngleDelta; + + -- Insert the potential direction + table.insert(Directions, { + Face = Direction.Face, + AngleDelta = AngleDelta, + DirectionAngle = DirectionAngle, + Offset = Direction.Offset + }); end; - -- Get the direction slope closest to the mouse's + -- Get the direction most similar to the dragging angle table.sort(Directions, function (A, B) - return A.SlopeDelta < B.SlopeDelta; + return A.AngleDelta < B.AngleDelta; end); + -- Center direction line at snap point + DirectionLine.Position = UDim2.new(0, ScreenSnappedPoint.X, 0, ScreenSnappedPoint.Y); + + -- Orient direction line towards drag direction + if math.abs(DragAngle - Directions[1].DirectionAngle) <= 90 then + DirectionLine.Rotation = Directions[1].DirectionAngle; + else + DirectionLine.Rotation = 180 + Directions[1].DirectionAngle; + end; + + -- Show the direction line + DirectionLine.PointMarker.Rotation = -DirectionLine.Rotation; + DirectionLine.SnapProgress.Size = UDim2.new(0, DirectionSettingLength, 2, 0); + DirectionLine.Visible = true; + + -- Check if drag has passed direction setting length + local Length = (SnappingEndAim - ScreenSnappedPoint).magnitude; + if Length < DirectionSettingLength then + return; + end; + + -- Clear the direction line + DirectionLine:Destroy() + -- Select the resizing direction that was closest to the mouse drag SnappingDirection = Directions[1].Face; SnappingDirectionOffset = Directions[1].Offset; @@ -9796,11 +10021,24 @@ function StartSnapping() -- Move to the destination-picking stage of snapping SnappingStage = 'Destination'; + -- Set destination-stage snapping options + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackFaceCentroids = true; SnapTracking.TargetFilter = function (Target) return not Target.Locked; end; SnapTracking.TargetBlacklist = Selection.Items; - -- Resize in the selected direction up to the targeted destination - elseif SnappingStage == 'Destination' then + -- Re-enable snapping to select destination + SnapTracking.StartTracking(function (NewPoint) + if NewPoint and NewPoint.p ~= SnappedPoint then + SnappedPoint = NewPoint.p; + PointSnapped:fire(NewPoint.p); + end; + end); + + -- Start a distance alignment line + AlignmentLine = Core.Tool.Interfaces.SnapLineSegment:Clone(); + AlignmentLine.Visible = false; + AlignmentLine.Parent = Core.UI; end; @@ -9809,7 +10047,10 @@ function StartSnapping() -- Listen for when a new point is snapped Connections.Snap = PointSnapped:connect(function (SnappedPoint) + -- Resize to snap point if in the destination stage of snapping if SnappingStage == 'Destination' then + + -- Calculate direction and distance to resize towards local Direction = (SnappingDirectionOffset - SnappingStartPoint).unit; local Distance = (SnappedPoint - SnappingStartPoint):Dot(Direction); @@ -9829,24 +10070,39 @@ function StartSnapping() end; end; + -- Update the distance alignment line + local ScreenStartPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint + (Direction * Distance)); + ScreenStartPoint = Vector2.new(ScreenStartPoint.X, ScreenStartPoint.Y); + local ScreenDestinationPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappedPoint); + ScreenDestinationPoint = Vector2.new(ScreenDestinationPoint.X, ScreenDestinationPoint.Y) + local AlignmentAngle = math.deg(math.atan2(ScreenDestinationPoint.Y - ScreenStartPoint.Y, ScreenDestinationPoint.X - ScreenStartPoint.X)); + local AlignmentCenter = ScreenStartPoint:Lerp(ScreenDestinationPoint, 0.5); + AlignmentLine.Position = UDim2.new(0, AlignmentCenter.X, 0, AlignmentCenter.Y); + AlignmentLine.Rotation = AlignmentAngle; + AlignmentLine.Size = UDim2.new(0, (ScreenDestinationPoint - ScreenStartPoint).magnitude, 0, 1); + AlignmentLine.PointMarkerA.Rotation = -AlignmentAngle; + AlignmentLine.Visible = true; + end; end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', false, function (Input) + end); - -- Restore the selection's original state + -- Listen for the end of the snapping + Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- If destination stage was reached, restore the selection's original state + if SnappingStage == 'Destination' then for Part, PartState in pairs(SnappingStartSelectionState) do Part:MakeJoints(); Part.CanCollide = PartState.CanCollide; Part.Anchored = PartState.Anchored; end; + end; - -- Finish snapping - FinishSnapping(); - - end); + -- Finish snapping + FinishSnapping(); end); @@ -9854,14 +10110,27 @@ end; function FinishSnapping() - -- Make sure snapping is enabled - if not SnapTracking.Enabled then + -- Ensure snapping is ongoing + if not SnappingStage then return; end; + -- Disable any snapping stage + SnappingStage = nil; + -- Stop snap point tracking SnapTracking.StopTracking(); + -- Clear any UI + if DirectionLine then + DirectionLine:Destroy(); + DirectionLine = nil; + end; + if AlignmentLine then + AlignmentLine:Destroy(); + AlignmentLine = nil; + end; + -- Register any change if HistoryRecord then RegisterChange(); @@ -9886,7 +10155,8 @@ function GetFaceOffsetsFromCorner(Part, Point) for _, Face in pairs(Faces) do -- Calculate the offset from the corner in the direction of the face - local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * Vector3.FromNormalId(Face); + local FaceOffset = (Vector3.FromNormalId(Face) * Part.Size) / 2; + local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * FaceOffset; table.insert(Offsets, { Face = Face, Offset = Offset }); end; @@ -9924,11 +10194,11 @@ end; return ResizeTool;]]> - + RotateTool - {B983F910-4440-431B-A881-AB6B5FB4C766} + {A7AB7D91-49BD-444B-A952-74ED46D19074} - + PaintTool - {8323345E-2D2F-4929-A57E-49A834D16BC3} + {0EA1E586-EFB4-4214-B3B7-FBC01CDED54C} - + Colors - {9E8DF8AA-CC39-498D-BF13-FB3AE5100F5C} + {C6EABBA4-1EA9-4305-B756-B8D9A8DF182C} - + MaterialTool - {4A849024-D15B-435A-AE42-44C636732F6F} + {6A8679E1-D40E-457E-9D79-E984DAA8CA4B} - + SurfaceTool - {FD107264-0289-40DE-B5E3-D7EFCB3BF7DE} + {706E28B3-CB18-4AE7-AFDA-9CC3D16B6BD6} - + AnchorTool - {39BB8B98-872F-45F2-9F81-9938C2770B07} + {BE379B00-A4F5-419C-A212-DF9B5314B2C9} - + WeldTool - {D5D58A5D-A5AE-4B70-8DB9-0F8B3D6B4A00} + {ECBCA2B4-1E19-4F4E-83B6-669C1081F4A1} - + TextureTool - {2008ECA0-2452-425A-B69F-E1D08E5D7849} + {EAA36324-C317-42BF-9A80-969E28F10BE8} - + MeshTool - {17186AB6-E03A-4606-8427-577D2EDCC376} + {3B00474D-3D83-4FB0-A224-076485D183D1} - + NewPartTool - {CE305198-CA4A-41C8-AD59-C58037734E7D} + {7E9DE192-2A40-4C2F-B9A5-E817A45736BE} - + CollisionTool - {4033ADF8-239A-4F3E-9A9E-18DA37C56500} + {83B427DA-EA7D-4BAF-908B-40AA669E5579} - + LightingTool - {D43C35D7-DA24-4CFB-87FF-A6470FD5E1D9} + {79DBCE5A-9F71-45B2-A6EA-288D265B4E32} - + DecorateTool - {D7840BB9-C484-4B12-A9EC-78CC6505EF79} + {0E0B695C-8E66-4E0B-90B9-376FCDA2F2A5} - + CoreToolLoader - {3F5C1C64-696A-4DD0-89F3-DBDED924332B} + {4C9EDCE1-0C3D-4DE1-8B26-64D37BA31A4B} - + HistoryModule - {6288DC45-6776-438D-87AA-228EECDAB939} + {4A65DBBA-9B53-4359-9564-49FF0A1627C6} - + SelectionModule - {70A36175-8C37-4C3D-9EDA-1450A97973E6} + {A29F8FD0-608F-47BE-9EFB-44606ADDBD18} - + SnappingModule - {9BA2249E-0910-42E8-A33B-A7770A0C2C2F} + {C34FDBD9-582C-4ACB-BB31-6068DC4E3F11} - + FilterMode false - + false FilterModeEnabler - {C561BA6D-45E6-4047-B075-C46E5D92043C} + {40F29F65-F981-4A7D-A3FB-B378FC62989E} script.Parent.Value = Workspace.FilteringEnabled; - + BoundingBoxModule - {06F07FFE-D7C3-4494-BAB7-1FAAA5F5E2C6} + {4C69E677-F657-40FA-B390-DEEC5CDD71C6} - + TargetingModule - {497E9CBE-EE0F-4770-A034-181C9F0B84E5} + {5949CB4F-7ECD-4B96-8669-DE93F1807D76} - + Interfaces - + true @@ -17053,7 +17369,7 @@ return TargetingModule;]]> true 1 - + false @@ -17092,7 +17408,7 @@ return TargetingModule;]]> true 1 - + false @@ -17132,7 +17448,7 @@ return TargetingModule;]]> 1 - + false @@ -17183,7 +17499,7 @@ return TargetingModule;]]> 1 - + false @@ -17235,7 +17551,7 @@ return TargetingModule;]]> - + false @@ -17274,7 +17590,7 @@ return TargetingModule;]]> true 1 - + false @@ -17325,7 +17641,7 @@ return TargetingModule;]]> 1 - + false @@ -17364,7 +17680,7 @@ return TargetingModule;]]> true 1 - + false @@ -17404,7 +17720,7 @@ return TargetingModule;]]> 1 - + true @@ -17459,7 +17775,7 @@ return TargetingModule;]]> 2 - + false @@ -17520,7 +17836,7 @@ return TargetingModule;]]> 1 - + false @@ -17572,7 +17888,7 @@ return TargetingModule;]]> - + false @@ -17611,7 +17927,7 @@ return TargetingModule;]]> true 1 - + false @@ -17651,7 +17967,7 @@ return TargetingModule;]]> 1 - + true @@ -17706,7 +18022,7 @@ return TargetingModule;]]> 2 - + false @@ -17767,7 +18083,7 @@ return TargetingModule;]]> 1 - + false @@ -17820,7 +18136,7 @@ return TargetingModule;]]> - + false @@ -17859,7 +18175,7 @@ return TargetingModule;]]> true 1 - + false @@ -17899,7 +18215,7 @@ return TargetingModule;]]> 1 - + false @@ -17952,7 +18268,7 @@ return TargetingModule;]]> - + true @@ -17991,7 +18307,7 @@ return TargetingModule;]]> true 1 - + false @@ -18030,7 +18346,7 @@ return TargetingModule;]]> true 1 - + false @@ -18070,7 +18386,7 @@ return TargetingModule;]]> 1 - + false @@ -18121,7 +18437,7 @@ return TargetingModule;]]> 1 - + false @@ -18173,7 +18489,7 @@ return TargetingModule;]]> - + false @@ -18212,7 +18528,7 @@ return TargetingModule;]]> true 1 - + false @@ -18263,7 +18579,7 @@ return TargetingModule;]]> 1 - + false @@ -18302,7 +18618,7 @@ return TargetingModule;]]> true 1 - + false @@ -18342,7 +18658,7 @@ return TargetingModule;]]> 1 - + true @@ -18397,7 +18713,7 @@ return TargetingModule;]]> 2 - + false @@ -18458,7 +18774,7 @@ return TargetingModule;]]> 1 - + false @@ -18510,7 +18826,7 @@ return TargetingModule;]]> - + false @@ -18549,7 +18865,7 @@ return TargetingModule;]]> true 1 - + false @@ -18589,7 +18905,7 @@ return TargetingModule;]]> 1 - + true @@ -18644,7 +18960,7 @@ return TargetingModule;]]> 2 - + false @@ -18705,7 +19021,7 @@ return TargetingModule;]]> 1 - + false @@ -18758,7 +19074,7 @@ return TargetingModule;]]> - + false @@ -18797,7 +19113,7 @@ return TargetingModule;]]> true 1 - + false @@ -18837,7 +19153,7 @@ return TargetingModule;]]> 1 - + false @@ -18890,7 +19206,7 @@ return TargetingModule;]]> - + true @@ -18929,7 +19245,7 @@ return TargetingModule;]]> true 1 - + false @@ -18969,7 +19285,7 @@ return TargetingModule;]]> 1 - + false @@ -19008,7 +19324,7 @@ return TargetingModule;]]> true 1 - + false @@ -19048,7 +19364,7 @@ return TargetingModule;]]> 1 - + false @@ -19099,7 +19415,7 @@ return TargetingModule;]]> 1 - + false @@ -19151,7 +19467,7 @@ return TargetingModule;]]> - + false @@ -19190,7 +19506,7 @@ return TargetingModule;]]> true 1 - + false @@ -19241,7 +19557,7 @@ return TargetingModule;]]> 1 - + true @@ -19306,7 +19622,7 @@ return TargetingModule;]]> 1 - + false @@ -19346,7 +19662,7 @@ return TargetingModule;]]> 1 - + true @@ -19401,7 +19717,7 @@ return TargetingModule;]]> 1 - + true @@ -19456,7 +19772,7 @@ return TargetingModule;]]> 1 - + false @@ -19496,7 +19812,7 @@ return TargetingModule;]]> 1 - + false @@ -19535,7 +19851,7 @@ return TargetingModule;]]> true 1 - + false @@ -19574,7 +19890,7 @@ return TargetingModule;]]> true 1 - + false @@ -19625,7 +19941,7 @@ return TargetingModule;]]> 1 - + false @@ -19664,7 +19980,7 @@ return TargetingModule;]]> true 1 - + false @@ -19725,7 +20041,7 @@ return TargetingModule;]]> 1 - + false @@ -19765,7 +20081,7 @@ return TargetingModule;]]> 1 - + true @@ -19821,7 +20137,7 @@ return TargetingModule;]]> - + false @@ -19860,7 +20176,7 @@ return TargetingModule;]]> true 1 - + false @@ -19911,7 +20227,7 @@ return TargetingModule;]]> 1 - + false @@ -19950,7 +20266,7 @@ return TargetingModule;]]> true 1 - + false @@ -20011,7 +20327,7 @@ return TargetingModule;]]> 1 - + false @@ -20051,7 +20367,7 @@ return TargetingModule;]]> 1 - + true @@ -20107,7 +20423,7 @@ return TargetingModule;]]> - + false @@ -20146,7 +20462,7 @@ return TargetingModule;]]> true 1 - + false @@ -20197,7 +20513,7 @@ return TargetingModule;]]> 1 - + false @@ -20236,7 +20552,7 @@ return TargetingModule;]]> true 1 - + false @@ -20297,7 +20613,7 @@ return TargetingModule;]]> 1 - + false @@ -20337,7 +20653,7 @@ return TargetingModule;]]> 1 - + true @@ -20393,7 +20709,7 @@ return TargetingModule;]]> - + false @@ -20432,7 +20748,7 @@ return TargetingModule;]]> true 1 - + true @@ -20496,7 +20812,7 @@ return TargetingModule;]]> true 1 - + false @@ -20537,7 +20853,7 @@ return TargetingModule;]]> - + false @@ -20588,7 +20904,7 @@ return TargetingModule;]]> 1 - + false @@ -20627,7 +20943,7 @@ return TargetingModule;]]> true 1 - + false @@ -20667,7 +20983,7 @@ return TargetingModule;]]> 1 - + false @@ -20722,7 +21038,7 @@ return TargetingModule;]]> - + false @@ -20773,7 +21089,7 @@ return TargetingModule;]]> 1 - + false @@ -20812,7 +21128,7 @@ return TargetingModule;]]> true 1 - + false @@ -20863,7 +21179,7 @@ return TargetingModule;]]> 1 - + true @@ -20928,7 +21244,7 @@ return TargetingModule;]]> 1 - + false @@ -20968,7 +21284,7 @@ return TargetingModule;]]> 1 - + true @@ -21023,7 +21339,7 @@ return TargetingModule;]]> 1 - + true @@ -21078,7 +21394,7 @@ return TargetingModule;]]> 1 - + false @@ -21118,7 +21434,7 @@ return TargetingModule;]]> 1 - + false @@ -21157,7 +21473,7 @@ return TargetingModule;]]> true 1 - + false @@ -21196,7 +21512,7 @@ return TargetingModule;]]> true 1 - + false @@ -21247,7 +21563,7 @@ return TargetingModule;]]> 1 - + false @@ -21286,7 +21602,7 @@ return TargetingModule;]]> true 1 - + false @@ -21347,7 +21663,7 @@ return TargetingModule;]]> 1 - + false @@ -21387,7 +21703,7 @@ return TargetingModule;]]> 1 - + true @@ -21443,7 +21759,7 @@ return TargetingModule;]]> - + false @@ -21482,7 +21798,7 @@ return TargetingModule;]]> true 1 - + false @@ -21533,7 +21849,7 @@ return TargetingModule;]]> 1 - + false @@ -21572,7 +21888,7 @@ return TargetingModule;]]> true 1 - + false @@ -21633,7 +21949,7 @@ return TargetingModule;]]> 1 - + false @@ -21673,7 +21989,7 @@ return TargetingModule;]]> 1 - + true @@ -21729,7 +22045,7 @@ return TargetingModule;]]> - + false @@ -21768,7 +22084,7 @@ return TargetingModule;]]> true 1 - + true @@ -21832,7 +22148,7 @@ return TargetingModule;]]> true 1 - + false @@ -21873,7 +22189,7 @@ return TargetingModule;]]> - + false @@ -21924,7 +22240,7 @@ return TargetingModule;]]> 1 - + false @@ -21963,7 +22279,7 @@ return TargetingModule;]]> true 1 - + false @@ -22003,7 +22319,7 @@ return TargetingModule;]]> 1 - + false @@ -22056,7 +22372,7 @@ return TargetingModule;]]> - + false @@ -22095,7 +22411,7 @@ return TargetingModule;]]> true 1 - + true @@ -22159,7 +22475,7 @@ return TargetingModule;]]> true 1 - + false @@ -22200,7 +22516,7 @@ return TargetingModule;]]> - + false @@ -22251,7 +22567,7 @@ return TargetingModule;]]> 1 - + false @@ -22290,7 +22606,7 @@ return TargetingModule;]]> true 1 - + false @@ -22330,7 +22646,7 @@ return TargetingModule;]]> 1 - + false @@ -22385,7 +22701,7 @@ return TargetingModule;]]> - + false @@ -22424,7 +22740,7 @@ return TargetingModule;]]> true 1 - + false @@ -22475,7 +22791,7 @@ return TargetingModule;]]> 1 - + true @@ -22540,7 +22856,7 @@ return TargetingModule;]]> 1 - + false @@ -22580,7 +22896,7 @@ return TargetingModule;]]> 1 - + true @@ -22635,7 +22951,7 @@ return TargetingModule;]]> 2 - + true @@ -22690,7 +23006,7 @@ return TargetingModule;]]> 2 - + false @@ -22730,7 +23046,7 @@ return TargetingModule;]]> 1 - + false @@ -22769,7 +23085,7 @@ return TargetingModule;]]> true 1 - + false @@ -22808,7 +23124,7 @@ return TargetingModule;]]> true 1 - + true @@ -22872,7 +23188,7 @@ return TargetingModule;]]> true 1 - + false @@ -22913,7 +23229,7 @@ return TargetingModule;]]> - + false @@ -22964,7 +23280,7 @@ return TargetingModule;]]> 1 - + false @@ -23003,7 +23319,7 @@ return TargetingModule;]]> true 1 - + false @@ -23043,7 +23359,7 @@ return TargetingModule;]]> 1 - + false @@ -23099,7 +23415,7 @@ return TargetingModule;]]> - + true @@ -23138,7 +23454,7 @@ return TargetingModule;]]> true 1 - + false @@ -23177,7 +23493,7 @@ return TargetingModule;]]> false 1 - + false @@ -23216,7 +23532,7 @@ return TargetingModule;]]> true 1 - + true @@ -23280,7 +23596,7 @@ return TargetingModule;]]> true 1 - + false @@ -23319,7 +23635,7 @@ return TargetingModule;]]> false 2 - + false @@ -23359,7 +23675,7 @@ return TargetingModule;]]> 2 - + false @@ -23412,7 +23728,7 @@ return TargetingModule;]]> - + true @@ -23476,7 +23792,7 @@ return TargetingModule;]]> true 1 - + false @@ -23515,7 +23831,7 @@ return TargetingModule;]]> false 2 - + false @@ -23555,7 +23871,7 @@ return TargetingModule;]]> 2 - + false @@ -23608,7 +23924,7 @@ return TargetingModule;]]> - + true @@ -23672,7 +23988,7 @@ return TargetingModule;]]> true 1 - + false @@ -23711,7 +24027,7 @@ return TargetingModule;]]> false 3 - + false @@ -23751,7 +24067,7 @@ return TargetingModule;]]> 3 - + false @@ -23804,7 +24120,7 @@ return TargetingModule;]]> - + false @@ -23843,7 +24159,7 @@ return TargetingModule;]]> true 1 - + false @@ -23882,7 +24198,7 @@ return TargetingModule;]]> false 2 - + false @@ -23922,7 +24238,7 @@ return TargetingModule;]]> 2 - + false @@ -23975,7 +24291,7 @@ return TargetingModule;]]> - + true @@ -24030,7 +24346,7 @@ return TargetingModule;]]> 2 - + true @@ -24086,7 +24402,7 @@ return TargetingModule;]]> - + false @@ -24140,7 +24456,7 @@ return TargetingModule;]]> 1 - + false @@ -24191,7 +24507,7 @@ return TargetingModule;]]> 1 - + false @@ -24230,7 +24546,7 @@ return TargetingModule;]]> true 1 - + true @@ -24285,7 +24601,7 @@ return TargetingModule;]]> 1 - + false @@ -24325,7 +24641,7 @@ return TargetingModule;]]> 1 - + false @@ -24378,7 +24694,7 @@ return TargetingModule;]]> - + true @@ -24417,7 +24733,7 @@ return TargetingModule;]]> true 1 - + true @@ -24481,7 +24797,7 @@ return TargetingModule;]]> true 1 - + false @@ -24543,7 +24859,7 @@ return TargetingModule;]]> - + true @@ -24607,7 +24923,7 @@ return TargetingModule;]]> true 2 - + false @@ -24647,7 +24963,7 @@ return TargetingModule;]]> 1 - + false @@ -24709,7 +25025,7 @@ return TargetingModule;]]> - + false @@ -24748,7 +25064,7 @@ return TargetingModule;]]> true 1 - + false @@ -24799,7 +25115,7 @@ return TargetingModule;]]> 1 - + false @@ -24838,7 +25154,7 @@ return TargetingModule;]]> true 1 - + false @@ -24879,7 +25195,7 @@ return TargetingModule;]]> - + true @@ -24932,7 +25248,7 @@ return TargetingModule;]]> true 2 - + false @@ -24995,7 +25311,7 @@ return TargetingModule;]]> - + false @@ -25034,7 +25350,7 @@ return TargetingModule;]]> true 1 - + false @@ -25085,7 +25401,7 @@ return TargetingModule;]]> 1 - + false @@ -25124,7 +25440,7 @@ return TargetingModule;]]> true 1 - + false @@ -25165,7 +25481,7 @@ return TargetingModule;]]> - + true @@ -25218,7 +25534,7 @@ return TargetingModule;]]> true 2 - + false @@ -25281,7 +25597,7 @@ return TargetingModule;]]> - + false @@ -25320,7 +25636,7 @@ return TargetingModule;]]> true 1 - + false @@ -25371,7 +25687,7 @@ return TargetingModule;]]> 1 - + false @@ -25410,7 +25726,7 @@ return TargetingModule;]]> true 1 - + false @@ -25451,7 +25767,7 @@ return TargetingModule;]]> - + true @@ -25504,7 +25820,7 @@ return TargetingModule;]]> true 2 - + false @@ -25567,7 +25883,7 @@ return TargetingModule;]]> - + false @@ -25606,7 +25922,7 @@ return TargetingModule;]]> true 1 - + false @@ -25647,7 +25963,7 @@ return TargetingModule;]]> - + true @@ -25701,7 +26017,7 @@ return TargetingModule;]]> true 2 - + false @@ -25742,7 +26058,7 @@ return TargetingModule;]]> - + true @@ -25796,7 +26112,7 @@ return TargetingModule;]]> true 2 - + false @@ -25837,7 +26153,7 @@ return TargetingModule;]]> - + [Component] @@ -25965,7 +26281,7 @@ return Component;]]> - + true @@ -26004,7 +26320,7 @@ return Component;]]> true 1 - + false @@ -26043,7 +26359,7 @@ return Component;]]> true 1 - + false @@ -26083,7 +26399,7 @@ return Component;]]> 1 - + true @@ -26138,7 +26454,7 @@ return Component;]]> 1 - + true @@ -26193,7 +26509,7 @@ return Component;]]> 1 - + false @@ -26233,7 +26549,7 @@ return Component;]]> 1 - + true @@ -26298,7 +26614,7 @@ return Component;]]> 1 - + false @@ -26349,7 +26665,7 @@ return Component;]]> 1 - + false @@ -26388,7 +26704,7 @@ return Component;]]> true 1 - + false @@ -26427,7 +26743,7 @@ return Component;]]> true 1 - + false @@ -26478,7 +26794,7 @@ return Component;]]> 1 - + true @@ -26544,7 +26860,7 @@ return Component;]]> - + false @@ -26583,7 +26899,7 @@ return Component;]]> true 1 - + false @@ -26622,7 +26938,7 @@ return Component;]]> true 1 - + true @@ -26676,7 +26992,7 @@ return Component;]]> 2 - + false @@ -26737,7 +27053,7 @@ return Component;]]> 1 - + false @@ -26778,7 +27094,7 @@ return Component;]]> - + false @@ -26830,7 +27146,7 @@ return Component;]]> - + false @@ -26869,7 +27185,7 @@ return Component;]]> true 1 - + false @@ -26908,7 +27224,7 @@ return Component;]]> true 1 - + true @@ -26962,7 +27278,7 @@ return Component;]]> 2 - + false @@ -27023,7 +27339,7 @@ return Component;]]> 1 - + false @@ -27064,7 +27380,7 @@ return Component;]]> - + false @@ -27116,7 +27432,7 @@ return Component;]]> - + false @@ -27155,7 +27471,7 @@ return Component;]]> true 1 - + true @@ -27219,7 +27535,7 @@ return Component;]]> true 1 - + false @@ -27260,7 +27576,7 @@ return Component;]]> - + false @@ -27311,7 +27627,7 @@ return Component;]]> 1 - + false @@ -27350,7 +27666,7 @@ return Component;]]> true 1 - + false @@ -27390,7 +27706,7 @@ return Component;]]> 1 - + false @@ -27445,7 +27761,7 @@ return Component;]]> - + false @@ -27496,7 +27812,7 @@ return Component;]]> 1 - + false @@ -27535,7 +27851,7 @@ return Component;]]> true 1 - + false @@ -27574,7 +27890,7 @@ return Component;]]> true 1 - + false @@ -27613,7 +27929,7 @@ return Component;]]> true 1 - + false @@ -27664,7 +27980,7 @@ return Component;]]> 1 - + true @@ -27730,7 +28046,7 @@ return Component;]]> - + false @@ -27769,7 +28085,7 @@ return Component;]]> true 1 - + false @@ -27820,7 +28136,7 @@ return Component;]]> 1 - + true @@ -27874,7 +28190,7 @@ return Component;]]> true 1 - + false @@ -27935,7 +28251,7 @@ return Component;]]> 3 - + true @@ -27989,7 +28305,7 @@ return Component;]]> false 4 - + false @@ -28041,12 +28357,12 @@ return Component;]]> - + Options - + false @@ -28086,7 +28402,7 @@ return Component;]]> 1 - + false @@ -28137,7 +28453,7 @@ return Component;]]> 3 - + [Component] @@ -28223,7 +28539,7 @@ return Component;]]> - + false @@ -28262,7 +28578,7 @@ return Component;]]> true 1 - + false @@ -28301,7 +28617,7 @@ return Component;]]> true 1 - + true @@ -28355,7 +28671,7 @@ return Component;]]> 2 - + false @@ -28416,7 +28732,7 @@ return Component;]]> 1 - + false @@ -28457,7 +28773,7 @@ return Component;]]> - + false @@ -28509,7 +28825,7 @@ return Component;]]> - + false @@ -28548,7 +28864,7 @@ return Component;]]> true 1 - + false @@ -28587,7 +28903,7 @@ return Component;]]> true 1 - + true @@ -28641,7 +28957,7 @@ return Component;]]> 2 - + false @@ -28681,7 +28997,7 @@ return Component;]]> 1 - + false @@ -28743,7 +29059,7 @@ return Component;]]> - + false @@ -28795,7 +29111,7 @@ return Component;]]> - + false @@ -28834,7 +29150,7 @@ return Component;]]> true 1 - + false @@ -28873,7 +29189,7 @@ return Component;]]> true 1 - + true @@ -28927,7 +29243,7 @@ return Component;]]> 2 - + false @@ -28988,7 +29304,7 @@ return Component;]]> 1 - + false @@ -29029,7 +29345,7 @@ return Component;]]> - + false @@ -29081,7 +29397,7 @@ return Component;]]> - + false @@ -29120,7 +29436,7 @@ return Component;]]> true 1 - + true @@ -29184,7 +29500,7 @@ return Component;]]> true 1 - + false @@ -29225,7 +29541,7 @@ return Component;]]> - + false @@ -29276,7 +29592,7 @@ return Component;]]> 1 - + false @@ -29315,7 +29631,7 @@ return Component;]]> true 1 - + false @@ -29355,7 +29671,7 @@ return Component;]]> 1 - + false @@ -29409,7 +29725,7 @@ return Component;]]> - + false @@ -29449,7 +29765,7 @@ return Component;]]> 1 - + true @@ -29504,7 +29820,7 @@ return Component;]]> 1 - + true @@ -29559,7 +29875,7 @@ return Component;]]> 1 - + false @@ -29599,7 +29915,7 @@ return Component;]]> 1 - + true @@ -29664,7 +29980,7 @@ return Component;]]> 1 - + false @@ -29716,7 +30032,7 @@ return Component;]]> - + false @@ -29755,7 +30071,7 @@ return Component;]]> true 1 - + false @@ -29806,7 +30122,7 @@ return Component;]]> 1 - + false @@ -29857,7 +30173,7 @@ return Component;]]> 1 - + false @@ -29898,7 +30214,7 @@ return Component;]]> - + false @@ -29938,7 +30254,7 @@ return Component;]]> 1 - + false @@ -29977,7 +30293,7 @@ return Component;]]> true 1 - + false @@ -30017,7 +30333,7 @@ return Component;]]> 1 - + true @@ -30072,7 +30388,7 @@ return Component;]]> 1 - + true @@ -30127,7 +30443,7 @@ return Component;]]> 1 - + false @@ -30167,7 +30483,7 @@ return Component;]]> 1 - + true @@ -30232,7 +30548,7 @@ return Component;]]> 1 - + false @@ -30283,7 +30599,7 @@ return Component;]]> 1 - + false @@ -30322,7 +30638,7 @@ return Component;]]> true 1 - + false @@ -30361,7 +30677,7 @@ return Component;]]> true 1 - + false @@ -30412,7 +30728,7 @@ return Component;]]> 1 - + true @@ -30478,7 +30794,7 @@ return Component;]]> - + false @@ -30517,7 +30833,7 @@ return Component;]]> true 1 - + false @@ -30568,7 +30884,7 @@ return Component;]]> 1 - + true @@ -30622,7 +30938,7 @@ return Component;]]> true 1 - + false @@ -30683,7 +30999,7 @@ return Component;]]> 3 - + true @@ -30737,7 +31053,7 @@ return Component;]]> false 4 - + false @@ -30789,12 +31105,12 @@ return Component;]]> - + Options - + false @@ -30834,7 +31150,7 @@ return Component;]]> 1 - + false @@ -30885,7 +31201,7 @@ return Component;]]> 3 - + [Component] @@ -30971,7 +31287,7 @@ return Component;]]> - + false @@ -31010,7 +31326,7 @@ return Component;]]> true 1 - + false @@ -31049,7 +31365,7 @@ return Component;]]> true 1 - + true @@ -31103,7 +31419,7 @@ return Component;]]> 2 - + false @@ -31164,7 +31480,7 @@ return Component;]]> 1 - + false @@ -31205,7 +31521,7 @@ return Component;]]> - + false @@ -31257,7 +31573,7 @@ return Component;]]> - + false @@ -31296,7 +31612,7 @@ return Component;]]> true 1 - + false @@ -31335,7 +31651,7 @@ return Component;]]> true 1 - + true @@ -31389,7 +31705,7 @@ return Component;]]> 2 - + false @@ -31429,7 +31745,7 @@ return Component;]]> 1 - + false @@ -31491,7 +31807,7 @@ return Component;]]> - + false @@ -31543,7 +31859,7 @@ return Component;]]> - + false @@ -31582,7 +31898,7 @@ return Component;]]> true 1 - + false @@ -31621,7 +31937,7 @@ return Component;]]> true 1 - + true @@ -31675,7 +31991,7 @@ return Component;]]> 2 - + false @@ -31736,7 +32052,7 @@ return Component;]]> 1 - + false @@ -31777,7 +32093,7 @@ return Component;]]> - + false @@ -31829,7 +32145,7 @@ return Component;]]> - + false @@ -31868,7 +32184,7 @@ return Component;]]> true 1 - + true @@ -31932,7 +32248,7 @@ return Component;]]> true 1 - + false @@ -31973,7 +32289,7 @@ return Component;]]> - + false @@ -32024,7 +32340,7 @@ return Component;]]> 1 - + false @@ -32063,7 +32379,7 @@ return Component;]]> true 1 - + false @@ -32103,7 +32419,7 @@ return Component;]]> 1 - + false @@ -32159,7 +32475,7 @@ return Component;]]> - + true @@ -32198,7 +32514,7 @@ return Component;]]> true 1 - + false @@ -32237,7 +32553,7 @@ return Component;]]> true 1 - + false @@ -32277,7 +32593,7 @@ return Component;]]> 1 - + false @@ -32328,7 +32644,7 @@ return Component;]]> 1 - + false @@ -32380,7 +32696,7 @@ return Component;]]> - + false @@ -32419,7 +32735,7 @@ return Component;]]> true 1 - + false @@ -32470,7 +32786,7 @@ return Component;]]> 1 - + true @@ -32524,7 +32840,7 @@ return Component;]]> true 1 - + false @@ -32585,7 +32901,7 @@ return Component;]]> 3 - + true @@ -32639,7 +32955,7 @@ return Component;]]> false 4 - + false @@ -32691,12 +33007,12 @@ return Component;]]> - + Options - + false @@ -32736,7 +33052,7 @@ return Component;]]> 1 - + false @@ -32787,7 +33103,7 @@ return Component;]]> 3 - + [Component] @@ -32873,7 +33189,7 @@ return Component;]]> - + false @@ -32912,7 +33228,7 @@ return Component;]]> true 1 - + false @@ -32963,7 +33279,7 @@ return Component;]]> 1 - + false @@ -33002,7 +33318,7 @@ return Component;]]> true 1 - + false @@ -33063,7 +33379,7 @@ return Component;]]> 1 - + false @@ -33103,7 +33419,7 @@ return Component;]]> 1 - + true @@ -33159,7 +33475,7 @@ return Component;]]> - + false @@ -33198,7 +33514,7 @@ return Component;]]> true 1 - + false @@ -33249,7 +33565,7 @@ return Component;]]> 1 - + false @@ -33288,7 +33604,7 @@ return Component;]]> true 1 - + false @@ -33328,7 +33644,7 @@ return Component;]]> 1 - + false @@ -33389,7 +33705,7 @@ return Component;]]> 1 - + true @@ -33445,7 +33761,7 @@ return Component;]]> - + false @@ -33484,7 +33800,7 @@ return Component;]]> true 1 - + false @@ -33525,7 +33841,7 @@ return Component;]]> - + false @@ -33577,7 +33893,7 @@ return Component;]]> - + true @@ -33616,7 +33932,7 @@ return Component;]]> true 1 - + false @@ -33655,7 +33971,7 @@ return Component;]]> true 1 - + false @@ -33695,7 +34011,7 @@ return Component;]]> 1 - + false @@ -33746,7 +34062,7 @@ return Component;]]> 1 - + false @@ -33798,7 +34114,7 @@ return Component;]]> - + false @@ -33837,7 +34153,7 @@ return Component;]]> false 1 - + false @@ -33888,7 +34204,7 @@ return Component;]]> 1 - + true @@ -33942,7 +34258,7 @@ return Component;]]> true 1 - + false @@ -34003,7 +34319,7 @@ return Component;]]> 3 - + true @@ -34057,7 +34373,7 @@ return Component;]]> false 4 - + false @@ -34109,12 +34425,12 @@ return Component;]]> - + Options - + false @@ -34154,7 +34470,7 @@ return Component;]]> 1 - + false @@ -34205,7 +34521,7 @@ return Component;]]> 3 - + [Component] @@ -34291,7 +34607,7 @@ return Component;]]> - + false @@ -34330,7 +34646,7 @@ return Component;]]> false 1 - + false @@ -34381,7 +34697,7 @@ return Component;]]> 1 - + false @@ -34420,7 +34736,7 @@ return Component;]]> true 1 - + false @@ -34481,7 +34797,7 @@ return Component;]]> 1 - + false @@ -34521,7 +34837,7 @@ return Component;]]> 1 - + true @@ -34576,7 +34892,7 @@ return Component;]]> - + false @@ -34615,7 +34931,7 @@ return Component;]]> true 1 - + false @@ -34676,7 +34992,7 @@ return Component;]]> 1 - + false @@ -34716,7 +35032,7 @@ return Component;]]> 1 - + true @@ -34771,7 +35087,7 @@ return Component;]]> - + false @@ -34810,7 +35126,7 @@ return Component;]]> true 1 - + false @@ -34871,7 +35187,7 @@ return Component;]]> 1 - + false @@ -34911,7 +35227,7 @@ return Component;]]> 1 - + true @@ -34967,7 +35283,7 @@ return Component;]]> - + false @@ -35006,7 +35322,7 @@ return Component;]]> false 1 - + true @@ -35061,7 +35377,7 @@ return Component;]]> 1 - + false @@ -35102,7 +35418,7 @@ return Component;]]> - + false @@ -35141,7 +35457,7 @@ return Component;]]> false 1 - + false @@ -35192,7 +35508,7 @@ return Component;]]> 1 - + true @@ -35246,7 +35562,7 @@ return Component;]]> 1 - + false @@ -35285,7 +35601,7 @@ return Component;]]> true 1 - + false @@ -35325,7 +35641,7 @@ return Component;]]> 1 - + false @@ -35365,7 +35681,7 @@ return Component;]]> 1 - + false @@ -35406,7 +35722,7 @@ return Component;]]> - + false @@ -35447,7 +35763,7 @@ return Component;]]> - + false @@ -35487,7 +35803,7 @@ return Component;]]> 1 - + false @@ -35526,7 +35842,7 @@ return Component;]]> false 1 - + false @@ -35577,7 +35893,7 @@ return Component;]]> 1 - + true @@ -35631,7 +35947,7 @@ return Component;]]> 1 - + false @@ -35670,7 +35986,7 @@ return Component;]]> true 1 - + false @@ -35710,7 +36026,7 @@ return Component;]]> 1 - + false @@ -35750,7 +36066,7 @@ return Component;]]> 1 - + false @@ -35791,7 +36107,7 @@ return Component;]]> - + false @@ -35832,7 +36148,7 @@ return Component;]]> - + false @@ -35871,7 +36187,7 @@ return Component;]]> false 1 - + true @@ -35926,7 +36242,7 @@ return Component;]]> 1 - + false @@ -35967,7 +36283,7 @@ return Component;]]> - + false @@ -36006,7 +36322,7 @@ return Component;]]> false 1 - + false @@ -36057,7 +36373,7 @@ return Component;]]> 1 - + false @@ -36096,7 +36412,7 @@ return Component;]]> true 1 - + false @@ -36136,7 +36452,7 @@ return Component;]]> 1 - + false @@ -36188,7 +36504,7 @@ return Component;]]> - + true @@ -36252,7 +36568,7 @@ return Component;]]> true 1 - + false @@ -36294,7 +36610,7 @@ return Component;]]> - + false @@ -36345,7 +36661,7 @@ return Component;]]> 1 - + false @@ -36384,7 +36700,7 @@ return Component;]]> false 1 - + false @@ -36435,7 +36751,7 @@ return Component;]]> 1 - + false @@ -36474,7 +36790,7 @@ return Component;]]> true 1 - + false @@ -36535,7 +36851,7 @@ return Component;]]> 1 - + false @@ -36575,7 +36891,7 @@ return Component;]]> 1 - + true @@ -36630,7 +36946,7 @@ return Component;]]> - + false @@ -36669,7 +36985,7 @@ return Component;]]> true 1 - + false @@ -36730,7 +37046,7 @@ return Component;]]> 1 - + false @@ -36770,7 +37086,7 @@ return Component;]]> 1 - + true @@ -36825,7 +37141,7 @@ return Component;]]> - + false @@ -36864,7 +37180,7 @@ return Component;]]> true 1 - + false @@ -36925,7 +37241,7 @@ return Component;]]> 1 - + false @@ -36965,7 +37281,7 @@ return Component;]]> 1 - + true @@ -37022,7 +37338,7 @@ return Component;]]> - + true @@ -37061,7 +37377,7 @@ return Component;]]> true 1 - + false @@ -37100,7 +37416,7 @@ return Component;]]> true 1 - + false @@ -37151,7 +37467,7 @@ return Component;]]> 1 - + false @@ -37192,7 +37508,7 @@ return Component;]]> - + false @@ -37231,7 +37547,7 @@ return Component;]]> false 1 - + false @@ -37270,7 +37586,7 @@ return Component;]]> true 1 - + false @@ -37309,7 +37625,7 @@ return Component;]]> true 1 - + false @@ -37370,7 +37686,7 @@ return Component;]]> 1 - + true @@ -37425,7 +37741,7 @@ return Component;]]> - + false @@ -37464,7 +37780,7 @@ return Component;]]> true 1 - + true @@ -37518,7 +37834,7 @@ return Component;]]> 2 - + false @@ -37580,7 +37896,7 @@ return Component;]]> - + false @@ -37619,7 +37935,7 @@ return Component;]]> true 1 - + true @@ -37673,7 +37989,7 @@ return Component;]]> 2 - + false @@ -37735,7 +38051,7 @@ return Component;]]> - + false @@ -37787,7 +38103,7 @@ return Component;]]> - + false @@ -37838,7 +38154,7 @@ return Component;]]> 1 - + false @@ -37879,7 +38195,7 @@ return Component;]]> - + false @@ -37918,7 +38234,7 @@ return Component;]]> true 1 - + false @@ -37957,7 +38273,7 @@ return Component;]]> true 1 - + false @@ -38009,7 +38325,7 @@ return Component;]]> - + false @@ -38048,7 +38364,7 @@ return Component;]]> true 1 - + false @@ -38109,7 +38425,7 @@ return Component;]]> 1 - + true @@ -38163,7 +38479,7 @@ return Component;]]> 2 - + false @@ -38205,7 +38521,7 @@ return Component;]]> - + false @@ -38244,7 +38560,7 @@ return Component;]]> true 1 - + false @@ -38295,7 +38611,7 @@ return Component;]]> 1 - + false @@ -38346,7 +38662,7 @@ return Component;]]> 1 - + false @@ -38387,7 +38703,7 @@ return Component;]]> - + false @@ -38426,7 +38742,7 @@ return Component;]]> true 1 - + false @@ -38465,7 +38781,7 @@ return Component;]]> true 1 - + false @@ -38517,7 +38833,7 @@ return Component;]]> - + false @@ -38556,7 +38872,7 @@ return Component;]]> true 1 - + false @@ -38607,7 +38923,7 @@ return Component;]]> 2 - + false @@ -38668,7 +38984,7 @@ return Component;]]> 1 - + true @@ -38723,7 +39039,7 @@ return Component;]]> 2 - + false @@ -38764,7 +39080,7 @@ return Component;]]> - + false @@ -38803,7 +39119,7 @@ return Component;]]> true 1 - + false @@ -38854,7 +39170,7 @@ return Component;]]> 2 - + false @@ -38915,7 +39231,7 @@ return Component;]]> 1 - + true @@ -38970,7 +39286,7 @@ return Component;]]> 2 - + false @@ -39011,7 +39327,7 @@ return Component;]]> - + false @@ -39050,7 +39366,7 @@ return Component;]]> true 1 - + false @@ -39101,7 +39417,7 @@ return Component;]]> 2 - + false @@ -39162,7 +39478,7 @@ return Component;]]> 1 - + true @@ -39217,7 +39533,7 @@ return Component;]]> 2 - + false @@ -39260,7 +39576,7 @@ return Component;]]> - + true @@ -39299,7 +39615,7 @@ return Component;]]> true 1 - + false @@ -39338,7 +39654,7 @@ return Component;]]> true 1 - + false @@ -39378,7 +39694,7 @@ return Component;]]> 1 - + false @@ -39429,7 +39745,7 @@ return Component;]]> 1 - + false @@ -39481,7 +39797,7 @@ return Component;]]> - + false @@ -39520,7 +39836,7 @@ return Component;]]> true 1 - + false @@ -39571,7 +39887,7 @@ return Component;]]> 1 - + true @@ -39625,7 +39941,7 @@ return Component;]]> true 1 - + false @@ -39686,7 +40002,7 @@ return Component;]]> 3 - + true @@ -39740,7 +40056,7 @@ return Component;]]> false 4 - + false @@ -39792,12 +40108,12 @@ return Component;]]> - + Options - + false @@ -39837,7 +40153,7 @@ return Component;]]> 1 - + false @@ -39888,7 +40204,7 @@ return Component;]]> 3 - + [Component] @@ -39974,7 +40290,7 @@ return Component;]]> - + false @@ -40013,7 +40329,7 @@ return Component;]]> true 1 - + false @@ -40053,7 +40369,7 @@ return Component;]]> 1 - + false @@ -40106,7 +40422,7 @@ return Component;]]> - + true @@ -40145,7 +40461,7 @@ return Component;]]> true 1 - + false @@ -40184,7 +40500,7 @@ return Component;]]> true 1 - + false @@ -40224,7 +40540,7 @@ return Component;]]> 1 - + false @@ -40275,7 +40591,7 @@ return Component;]]> 1 - + false @@ -40327,7 +40643,7 @@ return Component;]]> - + false @@ -40367,7 +40683,7 @@ return Component;]]> 1 - + true @@ -40421,7 +40737,7 @@ return Component;]]> true 1 - + false @@ -40471,7 +40787,7 @@ return Component;]]> false 1 - + false @@ -40514,7 +40830,7 @@ return Component;]]> - + true @@ -40553,7 +40869,7 @@ return Component;]]> true 1 - + false @@ -40592,7 +40908,7 @@ return Component;]]> true 1 - + false @@ -40631,7 +40947,7 @@ return Component;]]> true 1 - + false @@ -40671,7 +40987,7 @@ return Component;]]> 1 - + true @@ -40726,7 +41042,7 @@ return Component;]]> 2 - + false @@ -40787,7 +41103,7 @@ return Component;]]> 1 - + false @@ -40839,7 +41155,7 @@ return Component;]]> - + false @@ -40878,7 +41194,7 @@ return Component;]]> true 1 - + false @@ -40918,7 +41234,7 @@ return Component;]]> 1 - + true @@ -40973,7 +41289,7 @@ return Component;]]> 2 - + false @@ -41034,7 +41350,7 @@ return Component;]]> 1 - + false @@ -41086,7 +41402,7 @@ return Component;]]> - + false @@ -41125,7 +41441,7 @@ return Component;]]> true 1 - + false @@ -41178,7 +41494,7 @@ return Component;]]> - + false @@ -41217,7 +41533,7 @@ return Component;]]> true 1 - + false @@ -41257,7 +41573,7 @@ return Component;]]> 1 - + false @@ -41308,7 +41624,7 @@ return Component;]]> 1 - + false @@ -41360,7 +41676,7 @@ return Component;]]> - + false @@ -41399,7 +41715,7 @@ return Component;]]> true 1 - + false @@ -41438,7 +41754,7 @@ return Component;]]> true 1 - + false @@ -41478,7 +41794,7 @@ return Component;]]> 1 - + true @@ -41532,7 +41848,7 @@ return Component;]]> 2 - + false @@ -41594,7 +41910,7 @@ return Component;]]> - + false @@ -41633,7 +41949,7 @@ return Component;]]> true 1 - + false @@ -41686,7 +42002,7 @@ return Component;]]> - + false @@ -41725,7 +42041,7 @@ return Component;]]> false 1 - + false @@ -41765,7 +42081,7 @@ return Component;]]> 1 - + false @@ -41816,7 +42132,7 @@ return Component;]]> 1 - + false @@ -41855,7 +42171,7 @@ return Component;]]> true 1 - + false @@ -41906,7 +42222,7 @@ return Component;]]> 1 - + false @@ -41945,7 +42261,7 @@ return Component;]]> true 1 - + true @@ -41999,7 +42315,7 @@ return Component;]]> 2 - + false @@ -42061,7 +42377,7 @@ return Component;]]> - + false @@ -42100,7 +42416,7 @@ return Component;]]> true 1 - + true @@ -42154,7 +42470,7 @@ return Component;]]> 2 - + false @@ -42216,7 +42532,7 @@ return Component;]]> - + false @@ -42255,7 +42571,7 @@ return Component;]]> true 1 - + true @@ -42309,7 +42625,7 @@ return Component;]]> 2 - + false @@ -42373,7 +42689,7 @@ return Component;]]> - + false @@ -42412,7 +42728,7 @@ return Component;]]> true 1 - + false @@ -42452,7 +42768,7 @@ return Component;]]> 1 - + false @@ -42505,7 +42821,7 @@ return Component;]]> - + true @@ -42544,7 +42860,7 @@ return Component;]]> true 1 - + false @@ -42583,7 +42899,7 @@ return Component;]]> true 1 - + false @@ -42622,7 +42938,7 @@ return Component;]]> true 1 - + false @@ -42662,7 +42978,7 @@ return Component;]]> 1 - + true @@ -42717,7 +43033,7 @@ return Component;]]> 2 - + false @@ -42778,7 +43094,7 @@ return Component;]]> 1 - + false @@ -42830,7 +43146,7 @@ return Component;]]> - + false @@ -42869,7 +43185,7 @@ return Component;]]> true 1 - + false @@ -42909,7 +43225,7 @@ return Component;]]> 1 - + true @@ -42964,7 +43280,7 @@ return Component;]]> 2 - + false @@ -43025,7 +43341,7 @@ return Component;]]> 1 - + false @@ -43077,7 +43393,7 @@ return Component;]]> - + false @@ -43116,7 +43432,7 @@ return Component;]]> true 1 - + false @@ -43156,7 +43472,7 @@ return Component;]]> 1 - + true @@ -43211,7 +43527,7 @@ return Component;]]> 2 - + false @@ -43272,7 +43588,7 @@ return Component;]]> 1 - + false @@ -43324,7 +43640,7 @@ return Component;]]> - + false @@ -43363,7 +43679,7 @@ return Component;]]> true 1 - + false @@ -43416,7 +43732,7 @@ return Component;]]> - + false @@ -43455,7 +43771,7 @@ return Component;]]> true 1 - + false @@ -43495,7 +43811,7 @@ return Component;]]> 1 - + false @@ -43546,7 +43862,7 @@ return Component;]]> 1 - + false @@ -43598,7 +43914,7 @@ return Component;]]> - + false @@ -43637,7 +43953,7 @@ return Component;]]> true 1 - + false @@ -43676,7 +43992,7 @@ return Component;]]> true 1 - + false @@ -43716,7 +44032,7 @@ return Component;]]> 1 - + true @@ -43770,7 +44086,7 @@ return Component;]]> 2 - + false @@ -43832,7 +44148,7 @@ return Component;]]> - + false @@ -43871,7 +44187,7 @@ return Component;]]> true 1 - + false @@ -43924,7 +44240,7 @@ return Component;]]> - + false @@ -43963,7 +44279,7 @@ return Component;]]> false 1 - + false @@ -44003,7 +44319,7 @@ return Component;]]> 1 - + false @@ -44054,7 +44370,7 @@ return Component;]]> 1 - + false @@ -44093,7 +44409,7 @@ return Component;]]> true 1 - + false @@ -44144,7 +44460,7 @@ return Component;]]> 1 - + false @@ -44183,7 +44499,7 @@ return Component;]]> true 1 - + true @@ -44237,7 +44553,7 @@ return Component;]]> 2 - + false @@ -44299,7 +44615,7 @@ return Component;]]> - + false @@ -44338,7 +44654,7 @@ return Component;]]> true 1 - + true @@ -44392,7 +44708,7 @@ return Component;]]> 2 - + false @@ -44454,7 +44770,7 @@ return Component;]]> - + false @@ -44493,7 +44809,7 @@ return Component;]]> true 1 - + true @@ -44547,7 +44863,7 @@ return Component;]]> 2 - + false @@ -44611,7 +44927,7 @@ return Component;]]> - + false @@ -44650,7 +44966,7 @@ return Component;]]> true 1 - + false @@ -44690,7 +45006,7 @@ return Component;]]> 1 - + false @@ -44743,7 +45059,7 @@ return Component;]]> - + true @@ -44782,7 +45098,7 @@ return Component;]]> true 1 - + false @@ -44821,7 +45137,7 @@ return Component;]]> true 1 - + false @@ -44861,7 +45177,7 @@ return Component;]]> 1 - + false @@ -44912,7 +45228,7 @@ return Component;]]> 1 - + false @@ -44964,7 +45280,7 @@ return Component;]]> - + false @@ -45003,7 +45319,7 @@ return Component;]]> true 1 - + false @@ -45054,7 +45370,7 @@ return Component;]]> 1 - + true @@ -45108,7 +45424,7 @@ return Component;]]> true 1 - + false @@ -45169,7 +45485,7 @@ return Component;]]> 3 - + true @@ -45223,7 +45539,7 @@ return Component;]]> false 4 - + false @@ -45275,12 +45591,12 @@ return Component;]]> - + Options - + false @@ -45320,7 +45636,7 @@ return Component;]]> 1 - + false @@ -45371,7 +45687,7 @@ return Component;]]> 3 - + [Component] @@ -45457,7 +45773,7 @@ return Component;]]> - + false @@ -45496,7 +45812,7 @@ return Component;]]> true 1 - + false @@ -45547,7 +45863,7 @@ return Component;]]> 1 - + true @@ -45601,7 +45917,7 @@ return Component;]]> true 1 - + false @@ -45662,7 +45978,7 @@ return Component;]]> 3 - + true @@ -45716,7 +46032,7 @@ return Component;]]> false 4 - + false @@ -45768,12 +46084,12 @@ return Component;]]> - + Options - + false @@ -45813,7 +46129,7 @@ return Component;]]> 1 - + false @@ -45864,7 +46180,7 @@ return Component;]]> 3 - + [Component] @@ -45950,7 +46266,7 @@ return Component;]]> - + false @@ -45989,7 +46305,7 @@ return Component;]]> true 1 - + false @@ -46029,7 +46345,7 @@ return Component;]]> 1 - + false @@ -46082,7 +46398,7 @@ return Component;]]> - + true @@ -46121,7 +46437,7 @@ return Component;]]> true 1 - + false @@ -46160,7 +46476,7 @@ return Component;]]> true 1 - + false @@ -46200,7 +46516,7 @@ return Component;]]> 1 - + false @@ -46251,7 +46567,7 @@ return Component;]]> 1 - + false @@ -46303,7 +46619,7 @@ return Component;]]> - + false @@ -46342,7 +46658,7 @@ return Component;]]> true 1 - + false @@ -46393,7 +46709,7 @@ return Component;]]> 1 - + true @@ -46447,7 +46763,7 @@ return Component;]]> true 1 - + false @@ -46508,7 +46824,7 @@ return Component;]]> 3 - + true @@ -46562,7 +46878,7 @@ return Component;]]> false 4 - + false @@ -46614,12 +46930,12 @@ return Component;]]> - + Options - + false @@ -46659,7 +46975,7 @@ return Component;]]> 1 - + false @@ -46710,7 +47026,7 @@ return Component;]]> 3 - + [Component] @@ -46796,7 +47112,7 @@ return Component;]]> - + false @@ -46835,7 +47151,7 @@ return Component;]]> false 1 - + false @@ -46886,7 +47202,7 @@ return Component;]]> 1 - + false @@ -46925,7 +47241,7 @@ return Component;]]> true 1 - + false @@ -46986,7 +47302,7 @@ return Component;]]> 1 - + false @@ -47026,7 +47342,7 @@ return Component;]]> 1 - + true @@ -47081,7 +47397,7 @@ return Component;]]> - + false @@ -47120,7 +47436,7 @@ return Component;]]> true 1 - + false @@ -47181,7 +47497,7 @@ return Component;]]> 1 - + false @@ -47221,7 +47537,7 @@ return Component;]]> 1 - + true @@ -47277,7 +47593,7 @@ return Component;]]> - + false @@ -47317,7 +47633,7 @@ return Component;]]> 1 - + false @@ -47356,7 +47672,7 @@ return Component;]]> true 1 - + false @@ -47407,7 +47723,7 @@ return Component;]]> 1 - + false @@ -47446,7 +47762,7 @@ return Component;]]> true 1 - + false @@ -47507,7 +47823,7 @@ return Component;]]> 1 - + false @@ -47547,7 +47863,7 @@ return Component;]]> 1 - + true @@ -47603,7 +47919,7 @@ return Component;]]> - + false @@ -47642,7 +47958,7 @@ return Component;]]> true 1 - + false @@ -47693,7 +48009,7 @@ return Component;]]> 1 - + false @@ -47732,7 +48048,7 @@ return Component;]]> true 1 - + false @@ -47772,7 +48088,7 @@ return Component;]]> 1 - + true @@ -47827,7 +48143,7 @@ return Component;]]> 2 - + false @@ -47888,7 +48204,7 @@ return Component;]]> 1 - + false @@ -47940,7 +48256,7 @@ return Component;]]> - + false @@ -47979,7 +48295,7 @@ return Component;]]> true 1 - + true @@ -48034,7 +48350,7 @@ return Component;]]> 2 - + false @@ -48095,7 +48411,7 @@ return Component;]]> 1 - + false @@ -48146,7 +48462,7 @@ return Component;]]> 1 - + false @@ -48188,7 +48504,7 @@ return Component;]]> - + false @@ -48227,7 +48543,7 @@ return Component;]]> true 1 - + false @@ -48278,7 +48594,7 @@ return Component;]]> 1 - + false @@ -48317,7 +48633,7 @@ return Component;]]> true 1 - + false @@ -48357,7 +48673,7 @@ return Component;]]> 1 - + false @@ -48397,7 +48713,7 @@ return Component;]]> 1 - + false @@ -48438,7 +48754,7 @@ return Component;]]> - + false @@ -48478,7 +48794,7 @@ return Component;]]> 1 - + true @@ -48533,7 +48849,7 @@ return Component;]]> - + false @@ -48572,7 +48888,7 @@ return Component;]]> false 1 - + true @@ -48627,7 +48943,7 @@ return Component;]]> 1 - + false @@ -48668,7 +48984,7 @@ return Component;]]> - + false @@ -48707,7 +49023,7 @@ return Component;]]> true 1 - + true @@ -48762,7 +49078,7 @@ return Component;]]> 1 - + false @@ -48803,7 +49119,7 @@ return Component;]]> - + false @@ -48855,7 +49171,7 @@ return Component;]]> - + true @@ -48894,7 +49210,7 @@ return Component;]]> true 1 - + false @@ -48933,7 +49249,7 @@ return Component;]]> true 1 - + false @@ -48973,7 +49289,7 @@ return Component;]]> 1 - + false @@ -49024,7 +49340,7 @@ return Component;]]> 1 - + false @@ -49076,7 +49392,7 @@ return Component;]]> - + false @@ -49115,7 +49431,7 @@ return Component;]]> true 1 - + true @@ -49169,7 +49485,7 @@ return Component;]]> true 1 - + false @@ -49210,7 +49526,7 @@ return Component;]]> - + true @@ -49264,7 +49580,7 @@ return Component;]]> true 1 - + false @@ -49306,7 +49622,7 @@ return Component;]]> - + false @@ -49345,7 +49661,7 @@ return Component;]]> true 1 - + false @@ -49385,7 +49701,7 @@ return Component;]]> 1 - + false @@ -49438,127 +49754,7 @@ return Component;]]> - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - PointMarker - null - null - null - null - - 0 - 200 - 0 - 200 - - 0 - false - null - - 0.0125000002 - 0 - 0.0125000002 - 0 - - 1 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - 45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - -45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - + true @@ -49597,7 +49793,7 @@ return Component;]]> false 1 - + false @@ -49636,7 +49832,7 @@ return Component;]]> false 1 - + false @@ -49687,7 +49883,7 @@ return Component;]]> 1 - + false @@ -49738,7 +49934,7 @@ return Component;]]> 1 - + false @@ -49777,7 +49973,7 @@ return Component;]]> true 1 - + false @@ -49817,7 +50013,7 @@ return Component;]]> 1 - + false @@ -49857,7 +50053,7 @@ return Component;]]> 1 - + false @@ -49897,7 +50093,7 @@ return Component;]]> 1 - + false @@ -49937,7 +50133,7 @@ return Component;]]> 1 - + false @@ -49979,7 +50175,7 @@ return Component;]]> - + false @@ -50018,7 +50214,7 @@ return Component;]]> false 1 - + false @@ -50069,7 +50265,7 @@ return Component;]]> 1 - + false @@ -50108,7 +50304,7 @@ return Component;]]> true 1 - + false @@ -50148,7 +50344,7 @@ return Component;]]> 1 - + false @@ -50188,7 +50384,7 @@ return Component;]]> 1 - + false @@ -50228,7 +50424,7 @@ return Component;]]> 1 - + false @@ -50268,7 +50464,7 @@ return Component;]]> 1 - + false @@ -50310,7 +50506,7 @@ return Component;]]> - + false @@ -50349,7 +50545,7 @@ return Component;]]> false 1 - + true @@ -50404,7 +50600,7 @@ return Component;]]> 1 - + false @@ -50445,7 +50641,7 @@ return Component;]]> - + false @@ -50484,7 +50680,7 @@ return Component;]]> true 1 - + false @@ -50523,7 +50719,7 @@ return Component;]]> true 1 - + false @@ -50563,7 +50759,7 @@ return Component;]]> 1 - + false @@ -50603,7 +50799,7 @@ return Component;]]> 1 - + false @@ -50643,7 +50839,7 @@ return Component;]]> 1 - + false @@ -50683,7 +50879,7 @@ return Component;]]> 1 - + false @@ -50724,7 +50920,7 @@ return Component;]]> - + false @@ -50775,7 +50971,7 @@ return Component;]]> 1 - + false @@ -50814,7 +51010,7 @@ return Component;]]> true 1 - + false @@ -50854,7 +51050,7 @@ return Component;]]> 1 - + false @@ -50894,7 +51090,7 @@ return Component;]]> 1 - + false @@ -50934,7 +51130,7 @@ return Component;]]> 1 - + false @@ -50974,7 +51170,7 @@ return Component;]]> 1 - + false @@ -51015,7 +51211,7 @@ return Component;]]> - + true @@ -51069,7 +51265,7 @@ return Component;]]> true 1 - + false @@ -51111,7 +51307,7 @@ return Component;]]> - + [Component] @@ -51188,7 +51384,7 @@ return Component;]]> - + false @@ -51227,7 +51423,7 @@ return Component;]]> false 1 - + false @@ -51266,7 +51462,7 @@ return Component;]]> false 1 - + false @@ -51306,7 +51502,7 @@ return Component;]]> 1 - + true @@ -51361,7 +51557,7 @@ return Component;]]> 1 - + true @@ -51416,7 +51612,7 @@ return Component;]]> 1 - + false @@ -51456,7 +51652,7 @@ return Component;]]> 1 - + false @@ -51495,7 +51691,7 @@ return Component;]]> true 1 - + false @@ -51546,14 +51742,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -51592,7 +51788,7 @@ return Component;]]> false 1 - + false @@ -51643,13 +51839,13 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -51701,7 +51897,7 @@ return Component;]]> - + [Component] @@ -51755,7 +51951,7 @@ return Component;]]> - + false @@ -51794,7 +51990,7 @@ return Component;]]> false 1 - + false @@ -51834,7 +52030,7 @@ return Component;]]> 1 - + true @@ -51889,7 +52085,7 @@ return Component;]]> 1 - + true @@ -51944,7 +52140,7 @@ return Component;]]> 1 - + false @@ -51984,7 +52180,7 @@ return Component;]]> 1 - + false @@ -52023,7 +52219,7 @@ return Component;]]> true 1 - + false @@ -52074,14 +52270,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -52120,7 +52316,7 @@ return Component;]]> false 1 - + false @@ -52171,14 +52367,14 @@ return Component;]]> 1 - + NotificationSize 80 - + [Component] @@ -52232,7 +52428,7 @@ return Component;]]> - + false @@ -52271,7 +52467,7 @@ return Component;]]> false 1 - + false @@ -52311,7 +52507,7 @@ return Component;]]> 1 - + true @@ -52366,7 +52562,7 @@ return Component;]]> 1 - + true @@ -52421,7 +52617,7 @@ return Component;]]> 1 - + false @@ -52461,7 +52657,7 @@ return Component;]]> 1 - + false @@ -52500,7 +52696,7 @@ return Component;]]> true 1 - + false @@ -52551,14 +52747,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52597,7 +52793,7 @@ return Component;]]> false 1 - + false @@ -52648,7 +52844,7 @@ return Component;]]> 1 - + false @@ -52699,14 +52895,14 @@ return Component;]]> 1 - + NotificationSize 110 - + [Component] @@ -52760,7 +52956,7 @@ return Component;]]> - + 1 1 @@ -52773,7 +52969,7 @@ return Component;]]> 0 - + [Component] @@ -52833,7 +53029,487 @@ return Component;]]> - + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLineSegment + null + null + null + null + + 0 + 300 + 0 + 100 + + 0 + false + null + + 0 + 50 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarkerA + null + null + null + null + + 0 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 16 + 0 + 16 + + 2 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0 + 200 + 0 + 200 + + 0 + false + null + + 0.0149999997 + 0 + 0.0149999997 + 0 + + 1 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + + false + + 0.5 + 0 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLine + null + null + null + null + + 0 + 100 + 0 + 100 + + -45 + false + null + + 3 + 0 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0 + 0.5 + + 4280649727 + 0 + 4279970357 + 0 + false + false + 0 + SnapProgress + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 100 + 2 + 0 + + 0 + 0 + true + 2 + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0.00499999989 + 0 + 0.00499999989 + 0 + + 1 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + true @@ -52872,7 +53548,7 @@ return Component;]]> true 1 - + false @@ -52911,7 +53587,7 @@ return Component;]]> true 1 - + false @@ -52962,7 +53638,7 @@ return Component;]]> 1 - + true @@ -53026,7 +53702,7 @@ return Component;]]> true 1 - + false @@ -53076,7 +53752,7 @@ return Component;]]> false 10 - + [Component] @@ -53135,7 +53811,7 @@ return Component.Start();]]> - + false @@ -53176,7 +53852,7 @@ return Component.Start();]]> - + false @@ -53216,7 +53892,7 @@ return Component.Start();]]> 1 - + false @@ -53256,7 +53932,7 @@ return Component.Start();]]> 1 - + false @@ -53295,7 +53971,7 @@ return Component.Start();]]> false 1 - + false @@ -53334,7 +54010,7 @@ return Component.Start();]]> true 1 - + false @@ -53374,7 +54050,7 @@ return Component.Start();]]> 1 - + false @@ -53414,7 +54090,7 @@ return Component.Start();]]> 1 - + false @@ -53454,7 +54130,7 @@ return Component.Start();]]> 1 - + false @@ -53494,7 +54170,7 @@ return Component.Start();]]> 1 - + false @@ -53535,7 +54211,7 @@ return Component.Start();]]> - + false @@ -53588,7 +54264,7 @@ return Component.Start();]]> true 1 - + false @@ -53627,7 +54303,7 @@ return Component.Start();]]> true 1 - + false @@ -53667,7 +54343,7 @@ return Component.Start();]]> 1 - + false @@ -53707,7 +54383,7 @@ return Component.Start();]]> 1 - + false @@ -53747,7 +54423,7 @@ return Component.Start();]]> 1 - + false @@ -53787,7 +54463,7 @@ return Component.Start();]]> 1 - + false @@ -53828,7 +54504,7 @@ return Component.Start();]]> - + false @@ -53867,7 +54543,7 @@ return Component.Start();]]> true 1 - + false @@ -53922,7 +54598,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -53974,7 +54650,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54013,7 +54689,7 @@ roblox.com/library/142485815/import]]> true 1 - + false @@ -54070,7 +54746,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54122,7 +54798,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54173,7 +54849,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54226,7 +54902,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54276,7 +54952,7 @@ roblox.com/library/142485815/import]]> false 10 - + [Component] @@ -54339,7 +55015,7 @@ return Component;]]> - + true @@ -54404,7 +55080,7 @@ return Component;]]> 1 - + true @@ -54468,7 +55144,7 @@ return Component;]]> false 1 - + false @@ -54520,7 +55196,7 @@ return Component;]]> - + false @@ -54559,7 +55235,7 @@ return Component;]]> true 1 - + false @@ -54598,7 +55274,7 @@ return Component;]]> false 1 - + false @@ -54637,7 +55313,7 @@ return Component;]]> true 1 - + false @@ -54677,7 +55353,7 @@ return Component;]]> 1 - + false @@ -54730,7 +55406,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -54783,7 +55459,7 @@ TIP: Press R while hovering over a part to copy its color.]]> - + false @@ -54822,7 +55498,7 @@ TIP: Press R while hovering over a part to copy its color.]]> false 1 - + false @@ -54861,7 +55537,7 @@ TIP: Press R while hovering over a part to copy its color.]]> true 1 - + false @@ -54901,7 +55577,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -54954,7 +55630,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55007,7 +55683,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55046,7 +55722,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55085,7 +55761,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55125,7 +55801,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55176,7 +55852,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55229,7 +55905,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55268,7 +55944,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55307,7 +55983,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55347,7 +56023,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55400,7 +56076,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55453,7 +56129,7 @@ TIP: Press Enter to toggle anchor quickly.]]> - + false @@ -55492,7 +56168,7 @@ TIP: Press Enter to toggle anchor quickly.]]> false 1 - + false @@ -55531,7 +56207,7 @@ TIP: Press Enter to toggle anchor quickly.]]> true 1 - + false @@ -55571,7 +56247,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55624,7 +56300,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -55677,7 +56353,7 @@ TIP: Click and drag where you want your part to be.]]> - + false @@ -55716,7 +56392,7 @@ TIP: Click and drag where you want your part to be.]]> false 1 - + false @@ -55755,7 +56431,7 @@ TIP: Click and drag where you want your part to be.]]> true 1 - + false @@ -55795,7 +56471,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -55850,7 +56526,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -55903,7 +56579,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di - + false @@ -55942,7 +56618,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di false 1 - + false @@ -55981,7 +56657,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di true 1 - + false @@ -56021,7 +56697,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56078,7 +56754,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56131,7 +56807,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]> - + false @@ -56170,7 +56846,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>false 1 - + false @@ -56209,7 +56885,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>true 1 - + false @@ -56249,7 +56925,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56302,7 +56978,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56355,7 +57031,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -56394,7 +57070,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56433,7 +57109,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56473,7 +57149,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56524,7 +57200,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56577,7 +57253,457 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + WeldInfo + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 1 + 0 + + 0 + 0 + false + 1 + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + Content + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 310 + + 0 + 0 + true + 1 + + + + false + + 0 + 0 + + 4279308561 + 0 + 4279970357 + 0 + false + false + 0 + ColorBar + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + ToolDescription + null + null + null + null + + 0 + 10 + 0 + 25 + + 0 + false + null + + 0 + 90 + 0 + 300 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + WELD TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + CollisionInfo + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 1 + 0 + + 0 + 0 + false + 1 + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + Content + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 150 + + 0 + 0 + true + 1 + + + + false + + 0 + 0 + + 4279308561 + 0 + 4279970357 + 0 + false + false + 0 + ColorBar + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + ToolDescription + null + null + null + null + + 0 + 10 + 0 + 25 + + 0 + false + null + + 0 + 80 + 0 + 120 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + COLLISION TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + false @@ -56616,7 +57742,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56669,7 +57795,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56708,7 +57834,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56748,7 +57874,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56803,7 +57929,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -56854,7 +57980,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -56905,7 +58031,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -56957,7 +58083,7 @@ LAST - Relative to the last part selected]]> - + false @@ -56997,7 +58123,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -57036,7 +58162,7 @@ LAST - Relative to the last part selected]]> true 1 - + false @@ -57068,14 +58194,18 @@ LAST - Relative to the last part selected]]> null 0 - 80 + 82 0 400 0 1 - + false @@ -57147,7 +58277,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -57198,7 +58328,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57251,7 +58381,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -57290,7 +58420,7 @@ TIP: Hit the - key to quickly type increments.]]> false 1 - + false @@ -57310,7 +58440,7 @@ TIP: Hit the - key to quickly type increments.]]> 0 0 0 - 610 + 630 true false @@ -57343,7 +58473,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -57383,7 +58513,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57422,7 +58552,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -57454,12 +58584,12 @@ TIP: Hit the - key to quickly type increments.]]> null 0 - 93 + 94 0 400 0 - + 4/6 = Y axis (green) + 1/9 = Z axis (blue) + 2/8 = X axis (red) +(Shift = reverses increment)]]> 4294967295 false 10 @@ -57484,7 +58615,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -57536,7 +58667,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen - + false @@ -57575,7 +58706,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen true 1 - + false @@ -57615,7 +58746,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -57670,7 +58801,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57721,7 +58852,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57772,7 +58903,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57824,7 +58955,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -57875,7 +59006,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57928,7 +59059,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -57967,7 +59098,7 @@ LAST - Each part around the center of the last part selected]]> false 1 - + false @@ -57987,7 +59118,7 @@ LAST - Each part around the center of the last part selected]]> 0 0 0 - 525 + 540 true false @@ -58020,7 +59151,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -58060,7 +59191,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -58099,7 +59230,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -58152,7 +59283,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58204,7 +59335,7 @@ TIP: Click on a part to focus the handles on it.]]> - + false @@ -58243,7 +59374,7 @@ TIP: Click on a part to focus the handles on it.]]> true 1 - + false @@ -58294,7 +59425,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58326,7 +59457,7 @@ TIP: Click on a part to focus the handles on it.]]> null 0 - 80 + 82 0 400 @@ -58337,7 +59468,11 @@ TIP: Hit the - key to quickly type increments. TIP: Hit Enter to switch between directions quickly. -TIP: Use your right-side number keypad to resize exactly by the current increment (8/2 = up/down, 1/9 = back/forth, 4/6 = left/right) +TIP: Use your right-side number keypad to resize exactly by the current increment + 8/2 = up/down + 1/9 = back/forth + 4/6 = left/right +(Shift = reverses increment) TIP: Hold the R key, and click and drag the snap point of a part (in the direction that you want to resize) towards the snap point of another part, to resize up to that point.]]> 4294967295 @@ -58354,7 +59489,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -58405,7 +59540,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -58458,457 +59593,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - WeldInfo - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - false - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - Content - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 310 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4279308561 - 0 - 4279970357 - 0 - false - false - 0 - ColorBar - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 2 - - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - ToolDescription - null - null - null - null - - 0 - 10 - 0 - 25 - - 0 - false - null - - 0 - 90 - 0 - 300 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - ToolName - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 50 - 0 - 25 - - 0 - WELD TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 - true - 1 - - - - - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - CollisionInfo - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - false - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - Content - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 150 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4279308561 - 0 - 4279970357 - 0 - false - false - 0 - ColorBar - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 2 - - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - ToolDescription - null - null - null - null - - 0 - 10 - 0 - 25 - - 0 - false - null - - 0 - 80 - 0 - 120 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - ToolName - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 50 - 0 - 25 - - 0 - COLLISION TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 - true - 1 - - - - - + [Component] @@ -59069,7 +59754,7 @@ return Component;]]> - + [Component] @@ -59212,18 +59897,18 @@ return Component;]]> - + AutoUpdate true - + false AutomaticUpdating - {F93B4C0B-0241-4244-B8A2-66648002C401} + {7F22FE27-A0FA-41CC-A710-D94883923F4A} 0 then end;]]> - + -9.0008564 @@ -59317,7 +60002,7 @@ end;]]> 1 ThumbnailCamera - + true -0.5 @@ -59388,7 +60073,7 @@ end;]]> 0.200000003 - + true null @@ -59403,7 +60088,7 @@ end;]]> 0 0 - + false @@ -59465,12 +60150,12 @@ end;]]> - + false ThumbnailClearer - {B6F2498F-5598-4748-BE0E-FE105AC5FBB6} + {380A27C1-6A47-4A9A-B4A3-2A7844687D60} script.Parent:Destroy(); diff --git a/build/Building Tools by F3X.rbxmx b/build/Building Tools by F3X.rbxmx index 8b90bd6..0bbcf61 100644 --- a/build/Building Tools by F3X.rbxmx +++ b/build/Building Tools by F3X.rbxmx @@ -1,7 +1,7 @@ null nil - + true true @@ -25,7 +25,7 @@ Building Tools by F3X - + false -0.5 @@ -96,7 +96,7 @@ 0.800000012 - + 4294967295 5 @@ -105,7 +105,7 @@ 0 - + 4294967295 2 @@ -114,7 +114,7 @@ 0 - + 4294967295 3 @@ -123,7 +123,7 @@ 0 - + 4294967295 0 @@ -132,7 +132,7 @@ 0 - + 4294967295 1 @@ -141,7 +141,7 @@ 0 - + 4294967295 4 @@ -151,13 +151,13 @@ - + Version - 2.0.1 + 2.0.2 - + SupportLibrary @@ -934,7 +934,7 @@ end; return SupportLibrary;]]> - + SecurityModule @@ -1260,7 +1260,7 @@ end; return Security;]]> - + Region by AxisAngle @@ -1676,7 +1676,7 @@ end return Region]]> - + false @@ -1838,7 +1838,7 @@ end; -- Expose GetLibraries function _G.GetLibraries = GetLibraries;]]> - + F3X/SupportLibrary@1.0.0 @@ -2614,7 +2614,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -2631,7 +2631,7 @@ return SupportLibrary;]]> - + F3X/Cheer@0.0.1 @@ -3485,7 +3485,7 @@ setmetatable(Cheer, { return Cheer;]]> - + SupportLibrary @@ -4262,7 +4262,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -4279,7 +4279,7 @@ return SupportLibrary;]]> - + F3X/Try@1.0.0 @@ -4476,7 +4476,7 @@ end; return Try;]]> - + SupportLibrary @@ -5252,7 +5252,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -5270,7 +5270,7 @@ return SupportLibrary;]]> - + SerializationModule @@ -5719,11 +5719,11 @@ end; return Serialization;]]> - + SyncAPI - + SyncModule @@ -5773,10 +5773,8 @@ Actions = { -- Clones the given parts -- Make sure the given items are all parts - for _, Part in pairs(Parts) do - if not Part:IsA 'BasePart' then - return; - end; + if not ArePartsSelectable(Parts) then + return; end; -- Cache up permissions for all private areas @@ -5856,6 +5854,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -5903,6 +5906,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -5939,6 +5947,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -5999,6 +6012,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6061,6 +6079,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6121,6 +6144,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6163,6 +6191,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6202,6 +6235,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6257,6 +6295,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6327,6 +6370,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6382,6 +6430,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6455,6 +6508,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6502,6 +6560,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6564,6 +6627,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6620,6 +6688,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6683,6 +6756,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6717,6 +6795,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6751,6 +6834,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6785,6 +6873,11 @@ Actions = { ['CreateWelds'] = function (Parts, TargetPart) -- Creates welds for the given parts to the target part + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6843,6 +6936,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + local WeldsRemoved = 0; -- Cache up permissions for all private areas @@ -6898,6 +6996,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6943,6 +7046,11 @@ Actions = { return; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -7042,6 +7150,42 @@ Actions = { }; +function ArePartsSelectable(Parts) + -- Returns whether the parts are selectable + + -- Check whether each part is selectable + for _, Part in pairs(Parts) do + if not Part:IsA 'BasePart' or Part.Locked then + return false; + end; + end; + + -- Return true if all parts are selectable + return true; + +end; + +-- Keep current player updated in tool mode +if ToolMode == 'Tool' then + + -- Set current player + Player = Players:GetPlayerFromCharacter(Tool.Parent); + + -- Stay updated with latest player operating the tool + Tool.AncestryChanged:Connect(function (Child, Parent) + + -- Ensure tool's parent changed + if Child ~= Tool then + return; + end; + + -- Update current player + Player = Players:GetPlayerFromCharacter(Parent); + + end); + +end; + -- Provide an interface into the module return { @@ -7057,8 +7201,10 @@ return { return; end; - -- Update the Player pointer - Player = Client; + -- Ensure client is current player in tool mode + if ToolMode == 'Tool' then + assert(Player and (Client == Player), 'Permission denied for client'); + end; -- Execute valid actions return Action(...); @@ -7068,7 +7214,7 @@ return { };]]> - + false @@ -7098,11 +7244,11 @@ SyncAPI.OnInvoke = function (...) end;]]> - + ServerEndpoint - + false @@ -7123,17 +7269,17 @@ end;]]> - + Loaded false - + ComponentCount 0 - + false @@ -7151,7 +7297,7 @@ Count.Value = Support.GetDescendantCount(Tool) - ThumbnailDescendantCount;]]>

- + false @@ -7176,11 +7322,11 @@ Indicator.Value = true;]]> - + Assets - + {8B7D7D11-C7FF-4C9F-8574-03D34EE6ACE6} return Assets;]]> - + Core @@ -7416,6 +7562,7 @@ function Enable(Mouse) EnableHotkeys(); Targeting.EnableTargeting(); Selection.EnableOutlines(); + Selection.EnableMultiselectionHotkeys(); -- Equip current tool EquipTool(CurrentTool or require(Tool.Tools.MoveTool)); @@ -7534,6 +7681,14 @@ AssignHotkey({ 'RightShift', 'Z' }, History.Undo); AssignHotkey({ 'LeftShift', 'Y' }, History.Redo); AssignHotkey({ 'RightShift', 'Y' }, History.Redo); +-- If in-game, enable ctrl hotkeys for undoing and redoing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'Z' }, History.Undo); + AssignHotkey({ 'RightControl', 'Z' }, History.Undo); + AssignHotkey({ 'LeftControl', 'Y' }, History.Redo); + AssignHotkey({ 'RightControl', 'Y' }, History.Redo); +end; + function CloneSelection() -- Clones selected parts @@ -7644,6 +7799,14 @@ AssignHotkey({ 'RightShift', 'C' }, CloneSelection); AssignHotkey({ 'LeftShift', 'X' }, DeleteSelection); AssignHotkey({ 'RightShift', 'X' }, DeleteSelection); +-- If in-game, enable ctrl hotkeys for cloning and deleting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'C' }, CloneSelection); + AssignHotkey({ 'RightControl', 'C' }, CloneSelection); + AssignHotkey({ 'LeftControl', 'X' }, DeleteSelection); + AssignHotkey({ 'RightControl', 'X' }, DeleteSelection); +end; + function PrismSelect() -- Selects parts in the currently selected parts @@ -7695,6 +7858,12 @@ end; AssignHotkey({ 'LeftShift', 'K' }, PrismSelect); AssignHotkey({ 'RightShift', 'K' }, PrismSelect); +-- If in-game, enable ctrl hotkeys for prism selection +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'K' }, PrismSelect); + AssignHotkey({ 'RightControl', 'K' }, PrismSelect); +end; + function SelectSiblings(ReplaceSelection) -- Selects all parts under the same parent as the focused part @@ -7724,6 +7893,14 @@ AssignHotkey({ 'RightShift', 'LeftBracket' }, Support.Call(SelectSiblings, false AssignHotkey({ 'LeftShift', 'R' }, Support.Call(Selection.Clear, true)); AssignHotkey({ 'RightShift', 'R' }, Support.Call(Selection.Clear, true)); +-- If in-game, enable ctrl hotkeys for sibling selection & selection clearing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'RightControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'LeftControl', 'R' }, Support.Call(Selection.Clear, true)); + AssignHotkey({ 'RightControl', 'R' }, Support.Call(Selection.Clear, true)); +end; + function IsSelectable(Object) -- Returns whether `Object` can be selected @@ -7793,6 +7970,12 @@ end; AssignHotkey({ 'LeftShift', 'P' }, ExportSelection); AssignHotkey({ 'RightShift', 'P' }, ExportSelection); +-- If in-game, enable ctrl hotkeys for exporting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'P' }, ExportSelection); + AssignHotkey({ 'RightControl', 'P' }, ExportSelection); +end; + function IsVersionOutdated() -- Returns whether this version of Building Tools is out of date @@ -7860,7 +8043,7 @@ InitializeUI(); return getfenv(0);]]> - + false @@ -7885,11 +8068,11 @@ local Core = require(Tool:WaitForChild 'Core'); require(Tool.Tools.CoreToolLoader);]]> - + Tools - + MoveTool @@ -7999,7 +8182,7 @@ function ShowUI() local IncrementInput = MoveTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) MoveTool.Increment = tonumber(IncrementInput.Text) or MoveTool.Increment; - IncrementInput.Text = Support.Round(MoveTool.Increment, 3); + IncrementInput.Text = Support.Round(MoveTool.Increment, 4); end); -- Add functionality to the position inputs @@ -8201,8 +8384,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and dragging is ongoing + if not HandleDragging or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -8357,8 +8540,8 @@ function BindShortcutKeys() MoveTool.UI.IncrementOption.Increment.TextBox:CaptureFocus(); end; - -- Check if the R key was pressed down, and it wasn't Shift R - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Start tracking snap points nearest to the mouse StartSnapping(); @@ -8614,7 +8797,7 @@ function EnableDragging() end; -- Make sure this click was not to select - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + if Selection.Multiselecting then return; end; @@ -8983,7 +9166,7 @@ end; return MoveTool;]]> - + ResizeTool @@ -9093,7 +9276,7 @@ function ShowUI() local IncrementInput = ResizeTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) ResizeTool.Increment = tonumber(IncrementInput.Text) or ResizeTool.Increment; - IncrementInput.Text = Support.Round(ResizeTool.Increment, 3); + IncrementInput.Text = Support.Round(ResizeTool.Increment, 4); end); -- Add functionality to the size inputs @@ -9282,8 +9465,8 @@ function ShowHandles() Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and handle resizing is ongoing + if not HandleResizing or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -9294,8 +9477,7 @@ function ShowHandles() Core.Targeting.CancelSelecting(); -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -9363,8 +9545,7 @@ function HideHandles() Handles.Parent = nil; -- Clear unnecessary resources - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; @@ -9477,8 +9658,8 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByFace(Enum.NormalId.Right); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then StartSnapping(); end; @@ -9503,8 +9684,8 @@ function BindShortcutKeys() return; end; - -- Finish snapping when the R key is released (and it's not Shift R) - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Finish snapping when the R key is released, and it's not the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then FinishSnapping(); end; @@ -9738,10 +9919,13 @@ PointSnapped = Core.RbxUtility.CreateSignal(); function StartSnapping() -- Make sure snapping isn't already enabled - if SnapTracking.Enabled then + if SnappingStage or SnapTracking.Enabled then return; end; + -- Start first snapping stage + SnappingStage = 'Starting'; + -- Only enable corner snapping SnapTracking.TrackEdgeMidpoints = false; SnapTracking.TrackFaceCentroids = false; @@ -9767,48 +9951,89 @@ function StartSnapping() SnappingStartSelectionState = PreparePartsForResizing(); AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); + -- Pause snapping + SnapTracking.StopTracking(); + + -- Start a direction line + DirectionLine = Core.Tool.Interfaces.SnapLine:Clone(); + DirectionLine.Parent = Core.UI; + DirectionLine.Visible = false; + -- Track changes for history TrackChange(); -- Listen for when the user drags - Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', false, function (Input) + Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', true, function (Input) -- Update the latest aim SnappingEndAim = Vector2.new(Input.Position.X, Input.Position.Y); + ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); + ScreenSnappedPoint = Vector2.new(ScreenSnappedPoint.X, ScreenSnappedPoint.Y); - -- Use the mouse position to figure out the resize direction (until after 20px) - if SnappingStage == 'Direction' then + -- Calculate direction setting length + local DirectionSettingLength = math.min(50, math.max(50, (SnappingStartAim - ScreenSnappedPoint).magnitude * 1.5)); - -- Check the length - local Length = (SnappingEndAim - SnappingStartAim).magnitude; - if Length < 20 then - return; - end; + -- Use the mouse position to figure out the resize direction (until after direction setting length) + if SnappingStage == 'Direction' then - local DragSlope = (SnappingEndAim.Y - SnappingStartAim.Y) / (SnappingEndAim.X - SnappingStartAim.X); + -- Get current angle from snap point + local DragAngle = math.deg(math.atan2(SnappingEndAim.Y - ScreenSnappedPoint.Y, SnappingEndAim.X - ScreenSnappedPoint.X)); + DragAngle = (DragAngle > 0) and (DragAngle - 360) or DragAngle; -- Go through corner offsets representing the possible directions local Directions = {}; for _, Direction in pairs(SnappingStartDirections) do -- Map the corner & corner offset to screen points - local ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); local ScreenOffsetPoint = Workspace.CurrentCamera:WorldToScreenPoint(Direction.Offset); - -- Get the slope representing the direction (based on the mapped screen points) - local DirectionSlope = (ScreenOffsetPoint.Y - ScreenSnappedPoint.Y) / (ScreenOffsetPoint.X - ScreenSnappedPoint.X); + -- Get direction angle from snap point + local DirectionAngle = math.deg(math.atan2(ScreenOffsetPoint.Y - ScreenSnappedPoint.Y, ScreenOffsetPoint.X - ScreenSnappedPoint.X)); + DirectionAngle = (DirectionAngle > 0) and (DirectionAngle - 360) or DirectionAngle; + + -- Calculate delta between drag and direction angles + local AngleDelta = math.abs(DragAngle - DirectionAngle) % 180; + AngleDelta = (AngleDelta > 90) and (180 - AngleDelta) or AngleDelta; - -- Calculate the similarity between the drag & direction slopes - local SlopeDelta = math.abs(math.abs(DragSlope) - math.abs(DirectionSlope)); - table.insert(Directions, { Face = Direction.Face, SlopeDelta = SlopeDelta, Offset = Direction.Offset }); + -- Insert the potential direction + table.insert(Directions, { + Face = Direction.Face, + AngleDelta = AngleDelta, + DirectionAngle = DirectionAngle, + Offset = Direction.Offset + }); end; - -- Get the direction slope closest to the mouse's + -- Get the direction most similar to the dragging angle table.sort(Directions, function (A, B) - return A.SlopeDelta < B.SlopeDelta; + return A.AngleDelta < B.AngleDelta; end); + -- Center direction line at snap point + DirectionLine.Position = UDim2.new(0, ScreenSnappedPoint.X, 0, ScreenSnappedPoint.Y); + + -- Orient direction line towards drag direction + if math.abs(DragAngle - Directions[1].DirectionAngle) <= 90 then + DirectionLine.Rotation = Directions[1].DirectionAngle; + else + DirectionLine.Rotation = 180 + Directions[1].DirectionAngle; + end; + + -- Show the direction line + DirectionLine.PointMarker.Rotation = -DirectionLine.Rotation; + DirectionLine.SnapProgress.Size = UDim2.new(0, DirectionSettingLength, 2, 0); + DirectionLine.Visible = true; + + -- Check if drag has passed direction setting length + local Length = (SnappingEndAim - ScreenSnappedPoint).magnitude; + if Length < DirectionSettingLength then + return; + end; + + -- Clear the direction line + DirectionLine:Destroy() + -- Select the resizing direction that was closest to the mouse drag SnappingDirection = Directions[1].Face; SnappingDirectionOffset = Directions[1].Offset; @@ -9816,11 +10041,24 @@ function StartSnapping() -- Move to the destination-picking stage of snapping SnappingStage = 'Destination'; + -- Set destination-stage snapping options + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackFaceCentroids = true; SnapTracking.TargetFilter = function (Target) return not Target.Locked; end; SnapTracking.TargetBlacklist = Selection.Items; - -- Resize in the selected direction up to the targeted destination - elseif SnappingStage == 'Destination' then + -- Re-enable snapping to select destination + SnapTracking.StartTracking(function (NewPoint) + if NewPoint and NewPoint.p ~= SnappedPoint then + SnappedPoint = NewPoint.p; + PointSnapped:fire(NewPoint.p); + end; + end); + + -- Start a distance alignment line + AlignmentLine = Core.Tool.Interfaces.SnapLineSegment:Clone(); + AlignmentLine.Visible = false; + AlignmentLine.Parent = Core.UI; end; @@ -9829,7 +10067,10 @@ function StartSnapping() -- Listen for when a new point is snapped Connections.Snap = PointSnapped:connect(function (SnappedPoint) + -- Resize to snap point if in the destination stage of snapping if SnappingStage == 'Destination' then + + -- Calculate direction and distance to resize towards local Direction = (SnappingDirectionOffset - SnappingStartPoint).unit; local Distance = (SnappedPoint - SnappingStartPoint):Dot(Direction); @@ -9849,24 +10090,39 @@ function StartSnapping() end; end; + -- Update the distance alignment line + local ScreenStartPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint + (Direction * Distance)); + ScreenStartPoint = Vector2.new(ScreenStartPoint.X, ScreenStartPoint.Y); + local ScreenDestinationPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappedPoint); + ScreenDestinationPoint = Vector2.new(ScreenDestinationPoint.X, ScreenDestinationPoint.Y) + local AlignmentAngle = math.deg(math.atan2(ScreenDestinationPoint.Y - ScreenStartPoint.Y, ScreenDestinationPoint.X - ScreenStartPoint.X)); + local AlignmentCenter = ScreenStartPoint:Lerp(ScreenDestinationPoint, 0.5); + AlignmentLine.Position = UDim2.new(0, AlignmentCenter.X, 0, AlignmentCenter.Y); + AlignmentLine.Rotation = AlignmentAngle; + AlignmentLine.Size = UDim2.new(0, (ScreenDestinationPoint - ScreenStartPoint).magnitude, 0, 1); + AlignmentLine.PointMarkerA.Rotation = -AlignmentAngle; + AlignmentLine.Visible = true; + end; end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', false, function (Input) + end); + + -- Listen for the end of the snapping + Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) - -- Restore the selection's original state + -- If destination stage was reached, restore the selection's original state + if SnappingStage == 'Destination' then for Part, PartState in pairs(SnappingStartSelectionState) do Part:MakeJoints(); Part.CanCollide = PartState.CanCollide; Part.Anchored = PartState.Anchored; end; + end; - -- Finish snapping - FinishSnapping(); - - end); + -- Finish snapping + FinishSnapping(); end); @@ -9874,14 +10130,27 @@ end; function FinishSnapping() - -- Make sure snapping is enabled - if not SnapTracking.Enabled then + -- Ensure snapping is ongoing + if not SnappingStage then return; end; + -- Disable any snapping stage + SnappingStage = nil; + -- Stop snap point tracking SnapTracking.StopTracking(); + -- Clear any UI + if DirectionLine then + DirectionLine:Destroy(); + DirectionLine = nil; + end; + if AlignmentLine then + AlignmentLine:Destroy(); + AlignmentLine = nil; + end; + -- Register any change if HistoryRecord then RegisterChange(); @@ -9906,7 +10175,8 @@ function GetFaceOffsetsFromCorner(Part, Point) for _, Face in pairs(Faces) do -- Calculate the offset from the corner in the direction of the face - local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * Vector3.FromNormalId(Face); + local FaceOffset = (Vector3.FromNormalId(Face) * Part.Size) / 2; + local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * FaceOffset; table.insert(Offsets, { Face = Face, Offset = Offset }); end; @@ -9944,7 +10214,7 @@ end; return ResizeTool;]]> - + RotateTool @@ -10061,7 +10331,7 @@ function ShowUI() local IncrementInput = RotateTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) RotateTool.Increment = tonumber(IncrementInput.Text) or RotateTool.Increment; - IncrementInput.Text = Support.Round(RotateTool.Increment, 3); + IncrementInput.Text = Support.Round(RotateTool.Increment, 4); end); -- Add functionality to the rotation inputs @@ -10201,8 +10471,7 @@ function AttachHandles(Part, Autofocus) -- Disable autofocus if not requested and on elseif not Autofocus and Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; -- Just attach and show the handles if they already exist @@ -10263,8 +10532,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and rotating is ongoing + if not HandleRotating or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -10275,8 +10544,7 @@ function AttachHandles(Part, Autofocus) HandleRotating = false; -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -10341,10 +10609,7 @@ function HideHandles() Handles.Parent = nil; -- Disable handle autofocus if enabled - if Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; - end; + ClearConnection 'AutofocusHandle'; end; @@ -10446,8 +10711,12 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByAxis(Enum.Axis.Y, 1); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif (InputInfo.KeyCode == Enum.KeyCode.R) and not Selection.Multiselecting then + StartSnapping(); + + -- Start snapping when T key is pressed down (alias) + elseif InputInfo.KeyCode == Enum.KeyCode.T then StartSnapping(); end; @@ -10731,7 +11000,7 @@ end; return RotateTool;]]> - + PaintTool @@ -10973,8 +11242,8 @@ function BindShortcutKeys() end; - -- Check if the R key was pressed - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed, and it wasn't the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Set the current color to that of the current mouse target (if any) if Core.Mouse.Target then @@ -11086,7 +11355,7 @@ end; -- Return the tool return PaintTool;]]> - + Colors @@ -11226,7 +11495,7 @@ return BrickColors; ]]> - + MaterialTool @@ -11571,7 +11840,7 @@ end; return MaterialTool;]]> - + SurfaceTool @@ -11938,7 +12207,7 @@ end; return SurfaceTool;]]> - + AnchorTool @@ -12194,7 +12463,7 @@ end; return AnchorTool;]]> - + WeldTool @@ -12408,7 +12677,7 @@ end; return WeldTool;]]> - + TextureTool @@ -13026,7 +13295,7 @@ end; return TextureTool;]]> - + MeshTool @@ -13783,7 +14052,7 @@ end; return MeshTool;]]> - + NewPartTool @@ -13911,11 +14180,23 @@ function EnableClickCreation() return; end; + -- Enable new part dragging + DragNewParts = true; + Core.Targeting.CancelSelecting(); + -- Create the part CreatePart(NewPartTool.Type); end); + -- Listen for click releases + Connections.ClickReleaseListener = Support.AddUserInputListener('Ended', 'MouseButton1', true, function () + + -- Cancel dragging new parts if mouse button is released + DragNewParts = false; + + end); + end; function CreatePart(Type) @@ -13961,7 +14242,9 @@ function CreatePart(Type) Core.EquipTool(MoveTool); -- Enable dragging to allow easy positioning of the created part - MoveTool.SetUpDragging(Part); + if DragNewParts then + MoveTool.SetUpDragging(Part); + end; end; @@ -13969,7 +14252,7 @@ end; return NewPartTool;]]> - + CollisionTool @@ -14225,7 +14508,7 @@ end; return CollisionTool;]]> - + LightingTool @@ -14998,7 +15281,7 @@ end; return LightingTool;]]> - + DecorateTool @@ -15631,7 +15914,7 @@ end; return DecorateTool;]]> - + CoreToolLoader @@ -15715,7 +15998,7 @@ return true;]]> - + HistoryModule @@ -15798,7 +16081,7 @@ end; return History;]]> - + SelectionModule @@ -15813,6 +16096,7 @@ Selection = {}; Selection.Items = {}; Selection.Outlines = {}; Selection.Color = BrickColor.new 'Cyan'; +Selection.Multiselecting = false; -- Events to listen to selection changes Selection.ItemsAdded = RbxUtility.CreateSignal(); @@ -16083,6 +16367,42 @@ function Selection.EnableOutlines() end; +function Selection.EnableMultiselectionHotkeys() + -- Enables hotkeys for multiselecting + + -- Determine multiselection hotkeys + local Hotkeys = Support.FlipTable { 'LeftShift', 'RightShift', 'LeftControl', 'RightControl' }; + + -- Get core API + local Core = GetCore(); + + -- Listen for matching key presses + Core.Connections.MultiselectionHotkeys = Support.AddUserInputListener('Began', 'Keyboard', false, function (Input) + if Hotkeys[Input.KeyCode.Name] then + Selection.Multiselecting = true; + end; + end); + + -- Listen for matching key releases + Core.Connections.MultiselectingReleaseHotkeys = Support.AddUserInputListener('Ended', 'Keyboard', true, function (Input) + + -- Get currently pressed keys + local PressedKeys = Support.GetListMembers(Support.GetListMembers(Game:GetService('UserInputService'):GetKeysPressed(), 'KeyCode'), 'Name'); + + -- Continue multiselection if a hotkey is still pressed + for _, PressedKey in pairs(PressedKeys) do + if Hotkeys[PressedKey] then + return; + end; + end; + + -- Disable multiselection if matching key not found + Selection.Multiselecting = false; + + end); + +end; + function Selection.HideOutlines() -- Hides selection outlines @@ -16124,7 +16444,7 @@ end; return Selection;]]> - + SnappingModule @@ -16343,6 +16663,17 @@ end; function SnapTracking.StopTracking() -- Stops tracking the current closest snapping point, cleans up + -- Clear the previous tracking target, and callback + SnapTracking.Target = nil; + SnapTracking.Callback = nil; + + -- Reset snapping point options + SnapTracking.TrackFaceCentroids = true; + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackCorners = true; + SnapTracking.TargetFilter = nil; + SnapTracking.TargetBlacklist = {}; + -- Make sure we're currently tracking if not SnapTracking.Enabled then return; @@ -16355,18 +16686,6 @@ function SnapTracking.StopTracking() -- Clear the point marker UI from the screen SnapTracking.ClearUI(); - -- Clear the previous tracking target, and callback - SnapTracking.Target = nil; - SnapTracking.Callback = nil; - - -- Reset snapping point options - SnapTracking.TrackFaceCentroids = true; - SnapTracking.TrackEdgeMidpoints = true; - SnapTracking.TrackCorners = true; - - SnapTracking.TargetFilter = nil; - SnapTracking.TargetBlacklist = {}; - -- Indicate that tracking is no longer enabled SnapTracking.Enabled = false; @@ -16375,12 +16694,12 @@ end; return SnapTracking;]]> - + FilterMode false - + false @@ -16390,7 +16709,7 @@ return SnapTracking;]]> - + BoundingBoxModule @@ -16761,7 +17080,7 @@ end; return BoundingBoxModule;]]> - + TargetingModule @@ -16834,9 +17153,6 @@ end; function TargetingModule.SelectTarget() - -- Check if shift is held - local ShiftHeld = Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift); - -- Ensure target selection isn't cancelled if SelectionCancelled then SelectionCancelled = false; @@ -16844,7 +17160,7 @@ function TargetingModule.SelectTarget() end; -- Focus on clicked, selected item - if not ShiftHeld and Selection.Find(Target) then + if not Selection.Multiselecting and Selection.Find(Target) then Selection.SetFocus(Target); return; end; @@ -16855,17 +17171,17 @@ function TargetingModule.SelectTarget() return; end; - -- Unselect clicked, selected item if shift is held - if ShiftHeld and Selection.Find(Target) then + -- Unselect clicked, selected item if multiselection is enabled + if Selection.Multiselecting and Selection.Find(Target) then Selection.Remove({ Target }, true); return; end; - -- Add to selection if shift is held - if ShiftHeld then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add({ Target }, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace({ Target }, true); end; @@ -16999,11 +17315,11 @@ function TargetingModule.FinishRectangleSelecting() end; end; - -- Add to selection if shift is held - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add(SelectableItems, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace(SelectableItems, true); end; @@ -17030,11 +17346,11 @@ end; return TargetingModule;]]> - + Interfaces - + true @@ -17073,7 +17389,7 @@ return TargetingModule;]]> true 1 - + false @@ -17112,7 +17428,7 @@ return TargetingModule;]]> true 1 - + false @@ -17152,7 +17468,7 @@ return TargetingModule;]]> 1 - + false @@ -17203,7 +17519,7 @@ return TargetingModule;]]> 1 - + false @@ -17255,7 +17571,7 @@ return TargetingModule;]]> - + false @@ -17294,7 +17610,7 @@ return TargetingModule;]]> true 1 - + false @@ -17345,7 +17661,7 @@ return TargetingModule;]]> 1 - + false @@ -17384,7 +17700,7 @@ return TargetingModule;]]> true 1 - + false @@ -17424,7 +17740,7 @@ return TargetingModule;]]> 1 - + true @@ -17479,7 +17795,7 @@ return TargetingModule;]]> 2 - + false @@ -17540,7 +17856,7 @@ return TargetingModule;]]> 1 - + false @@ -17592,7 +17908,7 @@ return TargetingModule;]]> - + false @@ -17631,7 +17947,7 @@ return TargetingModule;]]> true 1 - + false @@ -17671,7 +17987,7 @@ return TargetingModule;]]> 1 - + true @@ -17726,7 +18042,7 @@ return TargetingModule;]]> 2 - + false @@ -17787,7 +18103,7 @@ return TargetingModule;]]> 1 - + false @@ -17840,7 +18156,7 @@ return TargetingModule;]]> - + false @@ -17879,7 +18195,7 @@ return TargetingModule;]]> true 1 - + false @@ -17919,7 +18235,7 @@ return TargetingModule;]]> 1 - + false @@ -17972,7 +18288,7 @@ return TargetingModule;]]> - + true @@ -18011,7 +18327,7 @@ return TargetingModule;]]> true 1 - + false @@ -18050,7 +18366,7 @@ return TargetingModule;]]> true 1 - + false @@ -18090,7 +18406,7 @@ return TargetingModule;]]> 1 - + false @@ -18141,7 +18457,7 @@ return TargetingModule;]]> 1 - + false @@ -18193,7 +18509,7 @@ return TargetingModule;]]> - + false @@ -18232,7 +18548,7 @@ return TargetingModule;]]> true 1 - + false @@ -18283,7 +18599,7 @@ return TargetingModule;]]> 1 - + false @@ -18322,7 +18638,7 @@ return TargetingModule;]]> true 1 - + false @@ -18362,7 +18678,7 @@ return TargetingModule;]]> 1 - + true @@ -18417,7 +18733,7 @@ return TargetingModule;]]> 2 - + false @@ -18478,7 +18794,7 @@ return TargetingModule;]]> 1 - + false @@ -18530,7 +18846,7 @@ return TargetingModule;]]> - + false @@ -18569,7 +18885,7 @@ return TargetingModule;]]> true 1 - + false @@ -18609,7 +18925,7 @@ return TargetingModule;]]> 1 - + true @@ -18664,7 +18980,7 @@ return TargetingModule;]]> 2 - + false @@ -18725,7 +19041,7 @@ return TargetingModule;]]> 1 - + false @@ -18778,7 +19094,7 @@ return TargetingModule;]]> - + false @@ -18817,7 +19133,7 @@ return TargetingModule;]]> true 1 - + false @@ -18857,7 +19173,7 @@ return TargetingModule;]]> 1 - + false @@ -18910,7 +19226,7 @@ return TargetingModule;]]> - + true @@ -18949,7 +19265,7 @@ return TargetingModule;]]> true 1 - + false @@ -18989,7 +19305,7 @@ return TargetingModule;]]> 1 - + false @@ -19028,7 +19344,7 @@ return TargetingModule;]]> true 1 - + false @@ -19068,7 +19384,7 @@ return TargetingModule;]]> 1 - + false @@ -19119,7 +19435,7 @@ return TargetingModule;]]> 1 - + false @@ -19171,7 +19487,7 @@ return TargetingModule;]]> - + false @@ -19210,7 +19526,7 @@ return TargetingModule;]]> true 1 - + false @@ -19261,7 +19577,7 @@ return TargetingModule;]]> 1 - + true @@ -19326,7 +19642,7 @@ return TargetingModule;]]> 1 - + false @@ -19366,7 +19682,7 @@ return TargetingModule;]]> 1 - + true @@ -19421,7 +19737,7 @@ return TargetingModule;]]> 1 - + true @@ -19476,7 +19792,7 @@ return TargetingModule;]]> 1 - + false @@ -19516,7 +19832,7 @@ return TargetingModule;]]> 1 - + false @@ -19555,7 +19871,7 @@ return TargetingModule;]]> true 1 - + false @@ -19594,7 +19910,7 @@ return TargetingModule;]]> true 1 - + false @@ -19645,7 +19961,7 @@ return TargetingModule;]]> 1 - + false @@ -19684,7 +20000,7 @@ return TargetingModule;]]> true 1 - + false @@ -19745,7 +20061,7 @@ return TargetingModule;]]> 1 - + false @@ -19785,7 +20101,7 @@ return TargetingModule;]]> 1 - + true @@ -19841,7 +20157,7 @@ return TargetingModule;]]> - + false @@ -19880,7 +20196,7 @@ return TargetingModule;]]> true 1 - + false @@ -19931,7 +20247,7 @@ return TargetingModule;]]> 1 - + false @@ -19970,7 +20286,7 @@ return TargetingModule;]]> true 1 - + false @@ -20031,7 +20347,7 @@ return TargetingModule;]]> 1 - + false @@ -20071,7 +20387,7 @@ return TargetingModule;]]> 1 - + true @@ -20127,7 +20443,7 @@ return TargetingModule;]]> - + false @@ -20166,7 +20482,7 @@ return TargetingModule;]]> true 1 - + false @@ -20217,7 +20533,7 @@ return TargetingModule;]]> 1 - + false @@ -20256,7 +20572,7 @@ return TargetingModule;]]> true 1 - + false @@ -20317,7 +20633,7 @@ return TargetingModule;]]> 1 - + false @@ -20357,7 +20673,7 @@ return TargetingModule;]]> 1 - + true @@ -20413,7 +20729,7 @@ return TargetingModule;]]> - + false @@ -20452,7 +20768,7 @@ return TargetingModule;]]> true 1 - + true @@ -20516,7 +20832,7 @@ return TargetingModule;]]> true 1 - + false @@ -20557,7 +20873,7 @@ return TargetingModule;]]> - + false @@ -20608,7 +20924,7 @@ return TargetingModule;]]> 1 - + false @@ -20647,7 +20963,7 @@ return TargetingModule;]]> true 1 - + false @@ -20687,7 +21003,7 @@ return TargetingModule;]]> 1 - + false @@ -20742,7 +21058,7 @@ return TargetingModule;]]> - + false @@ -20793,7 +21109,7 @@ return TargetingModule;]]> 1 - + false @@ -20832,7 +21148,7 @@ return TargetingModule;]]> true 1 - + false @@ -20883,7 +21199,7 @@ return TargetingModule;]]> 1 - + true @@ -20948,7 +21264,7 @@ return TargetingModule;]]> 1 - + false @@ -20988,7 +21304,7 @@ return TargetingModule;]]> 1 - + true @@ -21043,7 +21359,7 @@ return TargetingModule;]]> 1 - + true @@ -21098,7 +21414,7 @@ return TargetingModule;]]> 1 - + false @@ -21138,7 +21454,7 @@ return TargetingModule;]]> 1 - + false @@ -21177,7 +21493,7 @@ return TargetingModule;]]> true 1 - + false @@ -21216,7 +21532,7 @@ return TargetingModule;]]> true 1 - + false @@ -21267,7 +21583,7 @@ return TargetingModule;]]> 1 - + false @@ -21306,7 +21622,7 @@ return TargetingModule;]]> true 1 - + false @@ -21367,7 +21683,7 @@ return TargetingModule;]]> 1 - + false @@ -21407,7 +21723,7 @@ return TargetingModule;]]> 1 - + true @@ -21463,7 +21779,7 @@ return TargetingModule;]]> - + false @@ -21502,7 +21818,7 @@ return TargetingModule;]]> true 1 - + false @@ -21553,7 +21869,7 @@ return TargetingModule;]]> 1 - + false @@ -21592,7 +21908,7 @@ return TargetingModule;]]> true 1 - + false @@ -21653,7 +21969,7 @@ return TargetingModule;]]> 1 - + false @@ -21693,7 +22009,7 @@ return TargetingModule;]]> 1 - + true @@ -21749,7 +22065,7 @@ return TargetingModule;]]> - + false @@ -21788,7 +22104,7 @@ return TargetingModule;]]> true 1 - + true @@ -21852,7 +22168,7 @@ return TargetingModule;]]> true 1 - + false @@ -21893,7 +22209,7 @@ return TargetingModule;]]> - + false @@ -21944,7 +22260,7 @@ return TargetingModule;]]> 1 - + false @@ -21983,7 +22299,7 @@ return TargetingModule;]]> true 1 - + false @@ -22023,7 +22339,7 @@ return TargetingModule;]]> 1 - + false @@ -22076,7 +22392,7 @@ return TargetingModule;]]> - + false @@ -22115,7 +22431,7 @@ return TargetingModule;]]> true 1 - + true @@ -22179,7 +22495,7 @@ return TargetingModule;]]> true 1 - + false @@ -22220,7 +22536,7 @@ return TargetingModule;]]> - + false @@ -22271,7 +22587,7 @@ return TargetingModule;]]> 1 - + false @@ -22310,7 +22626,7 @@ return TargetingModule;]]> true 1 - + false @@ -22350,7 +22666,7 @@ return TargetingModule;]]> 1 - + false @@ -22405,7 +22721,7 @@ return TargetingModule;]]> - + false @@ -22444,7 +22760,7 @@ return TargetingModule;]]> true 1 - + false @@ -22495,7 +22811,7 @@ return TargetingModule;]]> 1 - + true @@ -22560,7 +22876,7 @@ return TargetingModule;]]> 1 - + false @@ -22600,7 +22916,7 @@ return TargetingModule;]]> 1 - + true @@ -22655,7 +22971,7 @@ return TargetingModule;]]> 2 - + true @@ -22710,7 +23026,7 @@ return TargetingModule;]]> 2 - + false @@ -22750,7 +23066,7 @@ return TargetingModule;]]> 1 - + false @@ -22789,7 +23105,7 @@ return TargetingModule;]]> true 1 - + false @@ -22828,7 +23144,7 @@ return TargetingModule;]]> true 1 - + true @@ -22892,7 +23208,7 @@ return TargetingModule;]]> true 1 - + false @@ -22933,7 +23249,7 @@ return TargetingModule;]]> - + false @@ -22984,7 +23300,7 @@ return TargetingModule;]]> 1 - + false @@ -23023,7 +23339,7 @@ return TargetingModule;]]> true 1 - + false @@ -23063,7 +23379,7 @@ return TargetingModule;]]> 1 - + false @@ -23119,7 +23435,7 @@ return TargetingModule;]]> - + true @@ -23158,7 +23474,7 @@ return TargetingModule;]]> true 1 - + false @@ -23197,7 +23513,7 @@ return TargetingModule;]]> false 1 - + false @@ -23236,7 +23552,7 @@ return TargetingModule;]]> true 1 - + true @@ -23300,7 +23616,7 @@ return TargetingModule;]]> true 1 - + false @@ -23339,7 +23655,7 @@ return TargetingModule;]]> false 2 - + false @@ -23379,7 +23695,7 @@ return TargetingModule;]]> 2 - + false @@ -23432,7 +23748,7 @@ return TargetingModule;]]> - + true @@ -23496,7 +23812,7 @@ return TargetingModule;]]> true 1 - + false @@ -23535,7 +23851,7 @@ return TargetingModule;]]> false 2 - + false @@ -23575,7 +23891,7 @@ return TargetingModule;]]> 2 - + false @@ -23628,7 +23944,7 @@ return TargetingModule;]]> - + true @@ -23692,7 +24008,7 @@ return TargetingModule;]]> true 1 - + false @@ -23731,7 +24047,7 @@ return TargetingModule;]]> false 3 - + false @@ -23771,7 +24087,7 @@ return TargetingModule;]]> 3 - + false @@ -23824,7 +24140,7 @@ return TargetingModule;]]> - + false @@ -23863,7 +24179,7 @@ return TargetingModule;]]> true 1 - + false @@ -23902,7 +24218,7 @@ return TargetingModule;]]> false 2 - + false @@ -23942,7 +24258,7 @@ return TargetingModule;]]> 2 - + false @@ -23995,7 +24311,7 @@ return TargetingModule;]]> - + true @@ -24050,7 +24366,7 @@ return TargetingModule;]]> 2 - + true @@ -24106,7 +24422,7 @@ return TargetingModule;]]> - + false @@ -24160,7 +24476,7 @@ return TargetingModule;]]> 1 - + false @@ -24211,7 +24527,7 @@ return TargetingModule;]]> 1 - + false @@ -24250,7 +24566,7 @@ return TargetingModule;]]> true 1 - + true @@ -24305,7 +24621,7 @@ return TargetingModule;]]> 1 - + false @@ -24345,7 +24661,7 @@ return TargetingModule;]]> 1 - + false @@ -24398,7 +24714,7 @@ return TargetingModule;]]> - + true @@ -24437,7 +24753,7 @@ return TargetingModule;]]> true 1 - + true @@ -24501,7 +24817,7 @@ return TargetingModule;]]> true 1 - + false @@ -24563,7 +24879,7 @@ return TargetingModule;]]> - + true @@ -24627,7 +24943,7 @@ return TargetingModule;]]> true 2 - + false @@ -24667,7 +24983,7 @@ return TargetingModule;]]> 1 - + false @@ -24729,7 +25045,7 @@ return TargetingModule;]]> - + false @@ -24768,7 +25084,7 @@ return TargetingModule;]]> true 1 - + false @@ -24819,7 +25135,7 @@ return TargetingModule;]]> 1 - + false @@ -24858,7 +25174,7 @@ return TargetingModule;]]> true 1 - + false @@ -24899,7 +25215,7 @@ return TargetingModule;]]> - + true @@ -24952,7 +25268,7 @@ return TargetingModule;]]> true 2 - + false @@ -25015,7 +25331,7 @@ return TargetingModule;]]> - + false @@ -25054,7 +25370,7 @@ return TargetingModule;]]> true 1 - + false @@ -25105,7 +25421,7 @@ return TargetingModule;]]> 1 - + false @@ -25144,7 +25460,7 @@ return TargetingModule;]]> true 1 - + false @@ -25185,7 +25501,7 @@ return TargetingModule;]]> - + true @@ -25238,7 +25554,7 @@ return TargetingModule;]]> true 2 - + false @@ -25301,7 +25617,7 @@ return TargetingModule;]]> - + false @@ -25340,7 +25656,7 @@ return TargetingModule;]]> true 1 - + false @@ -25391,7 +25707,7 @@ return TargetingModule;]]> 1 - + false @@ -25430,7 +25746,7 @@ return TargetingModule;]]> true 1 - + false @@ -25471,7 +25787,7 @@ return TargetingModule;]]> - + true @@ -25524,7 +25840,7 @@ return TargetingModule;]]> true 2 - + false @@ -25587,7 +25903,7 @@ return TargetingModule;]]> - + false @@ -25626,7 +25942,7 @@ return TargetingModule;]]> true 1 - + false @@ -25667,7 +25983,7 @@ return TargetingModule;]]> - + true @@ -25721,7 +26037,7 @@ return TargetingModule;]]> true 2 - + false @@ -25762,7 +26078,7 @@ return TargetingModule;]]> - + true @@ -25816,7 +26132,7 @@ return TargetingModule;]]> true 2 - + false @@ -25857,7 +26173,7 @@ return TargetingModule;]]> - + false @@ -25986,7 +26302,7 @@ return Component;]]> - + true @@ -26025,7 +26341,7 @@ return Component;]]> true 1 - + false @@ -26064,7 +26380,7 @@ return Component;]]> true 1 - + false @@ -26104,7 +26420,7 @@ return Component;]]> 1 - + true @@ -26159,7 +26475,7 @@ return Component;]]> 1 - + true @@ -26214,7 +26530,7 @@ return Component;]]> 1 - + false @@ -26254,7 +26570,7 @@ return Component;]]> 1 - + true @@ -26319,7 +26635,7 @@ return Component;]]> 1 - + false @@ -26370,7 +26686,7 @@ return Component;]]> 1 - + false @@ -26409,7 +26725,7 @@ return Component;]]> true 1 - + false @@ -26448,7 +26764,7 @@ return Component;]]> true 1 - + false @@ -26499,7 +26815,7 @@ return Component;]]> 1 - + true @@ -26565,7 +26881,7 @@ return Component;]]> - + false @@ -26604,7 +26920,7 @@ return Component;]]> true 1 - + false @@ -26643,7 +26959,7 @@ return Component;]]> true 1 - + true @@ -26697,7 +27013,7 @@ return Component;]]> 2 - + false @@ -26758,7 +27074,7 @@ return Component;]]> 1 - + false @@ -26799,7 +27115,7 @@ return Component;]]> - + false @@ -26851,7 +27167,7 @@ return Component;]]> - + false @@ -26890,7 +27206,7 @@ return Component;]]> true 1 - + false @@ -26929,7 +27245,7 @@ return Component;]]> true 1 - + true @@ -26983,7 +27299,7 @@ return Component;]]> 2 - + false @@ -27044,7 +27360,7 @@ return Component;]]> 1 - + false @@ -27085,7 +27401,7 @@ return Component;]]> - + false @@ -27137,7 +27453,7 @@ return Component;]]> - + false @@ -27176,7 +27492,7 @@ return Component;]]> true 1 - + true @@ -27240,7 +27556,7 @@ return Component;]]> true 1 - + false @@ -27281,7 +27597,7 @@ return Component;]]> - + false @@ -27332,7 +27648,7 @@ return Component;]]> 1 - + false @@ -27371,7 +27687,7 @@ return Component;]]> true 1 - + false @@ -27411,7 +27727,7 @@ return Component;]]> 1 - + false @@ -27466,7 +27782,7 @@ return Component;]]> - + false @@ -27517,7 +27833,7 @@ return Component;]]> 1 - + false @@ -27556,7 +27872,7 @@ return Component;]]> true 1 - + false @@ -27595,7 +27911,7 @@ return Component;]]> true 1 - + false @@ -27634,7 +27950,7 @@ return Component;]]> true 1 - + false @@ -27685,7 +28001,7 @@ return Component;]]> 1 - + true @@ -27751,7 +28067,7 @@ return Component;]]> - + false @@ -27790,7 +28106,7 @@ return Component;]]> true 1 - + false @@ -27841,7 +28157,7 @@ return Component;]]> 1 - + true @@ -27895,7 +28211,7 @@ return Component;]]> true 1 - + false @@ -27956,7 +28272,7 @@ return Component;]]> 3 - + true @@ -28010,7 +28326,7 @@ return Component;]]> false 4 - + false @@ -28062,12 +28378,12 @@ return Component;]]> - + Options - + false @@ -28107,7 +28423,7 @@ return Component;]]> 1 - + false @@ -28158,7 +28474,7 @@ return Component;]]> 3 - + false @@ -28245,7 +28561,7 @@ return Component;]]> - + false @@ -28284,7 +28600,7 @@ return Component;]]> true 1 - + false @@ -28323,7 +28639,7 @@ return Component;]]> true 1 - + true @@ -28377,7 +28693,7 @@ return Component;]]> 2 - + false @@ -28438,7 +28754,7 @@ return Component;]]> 1 - + false @@ -28479,7 +28795,7 @@ return Component;]]> - + false @@ -28531,7 +28847,7 @@ return Component;]]> - + false @@ -28570,7 +28886,7 @@ return Component;]]> true 1 - + false @@ -28609,7 +28925,7 @@ return Component;]]> true 1 - + true @@ -28663,7 +28979,7 @@ return Component;]]> 2 - + false @@ -28703,7 +29019,7 @@ return Component;]]> 1 - + false @@ -28765,7 +29081,7 @@ return Component;]]> - + false @@ -28817,7 +29133,7 @@ return Component;]]> - + false @@ -28856,7 +29172,7 @@ return Component;]]> true 1 - + false @@ -28895,7 +29211,7 @@ return Component;]]> true 1 - + true @@ -28949,7 +29265,7 @@ return Component;]]> 2 - + false @@ -29010,7 +29326,7 @@ return Component;]]> 1 - + false @@ -29051,7 +29367,7 @@ return Component;]]> - + false @@ -29103,7 +29419,7 @@ return Component;]]> - + false @@ -29142,7 +29458,7 @@ return Component;]]> true 1 - + true @@ -29206,7 +29522,7 @@ return Component;]]> true 1 - + false @@ -29247,7 +29563,7 @@ return Component;]]> - + false @@ -29298,7 +29614,7 @@ return Component;]]> 1 - + false @@ -29337,7 +29653,7 @@ return Component;]]> true 1 - + false @@ -29377,7 +29693,7 @@ return Component;]]> 1 - + false @@ -29431,7 +29747,7 @@ return Component;]]> - + false @@ -29471,7 +29787,7 @@ return Component;]]> 1 - + true @@ -29526,7 +29842,7 @@ return Component;]]> 1 - + true @@ -29581,7 +29897,7 @@ return Component;]]> 1 - + false @@ -29621,7 +29937,7 @@ return Component;]]> 1 - + true @@ -29686,7 +30002,7 @@ return Component;]]> 1 - + false @@ -29738,7 +30054,7 @@ return Component;]]> - + false @@ -29777,7 +30093,7 @@ return Component;]]> true 1 - + false @@ -29828,7 +30144,7 @@ return Component;]]> 1 - + false @@ -29879,7 +30195,7 @@ return Component;]]> 1 - + false @@ -29920,7 +30236,7 @@ return Component;]]> - + false @@ -29960,7 +30276,7 @@ return Component;]]> 1 - + false @@ -29999,7 +30315,7 @@ return Component;]]> true 1 - + false @@ -30039,7 +30355,7 @@ return Component;]]> 1 - + true @@ -30094,7 +30410,7 @@ return Component;]]> 1 - + true @@ -30149,7 +30465,7 @@ return Component;]]> 1 - + false @@ -30189,7 +30505,7 @@ return Component;]]> 1 - + true @@ -30254,7 +30570,7 @@ return Component;]]> 1 - + false @@ -30305,7 +30621,7 @@ return Component;]]> 1 - + false @@ -30344,7 +30660,7 @@ return Component;]]> true 1 - + false @@ -30383,7 +30699,7 @@ return Component;]]> true 1 - + false @@ -30434,7 +30750,7 @@ return Component;]]> 1 - + true @@ -30500,7 +30816,7 @@ return Component;]]> - + false @@ -30539,7 +30855,7 @@ return Component;]]> true 1 - + false @@ -30590,7 +30906,7 @@ return Component;]]> 1 - + true @@ -30644,7 +30960,7 @@ return Component;]]> true 1 - + false @@ -30705,7 +31021,7 @@ return Component;]]> 3 - + true @@ -30759,7 +31075,7 @@ return Component;]]> false 4 - + false @@ -30811,12 +31127,12 @@ return Component;]]> - + Options - + false @@ -30856,7 +31172,7 @@ return Component;]]> 1 - + false @@ -30907,7 +31223,7 @@ return Component;]]> 3 - + false @@ -30994,7 +31310,7 @@ return Component;]]> - + false @@ -31033,7 +31349,7 @@ return Component;]]> true 1 - + false @@ -31072,7 +31388,7 @@ return Component;]]> true 1 - + true @@ -31126,7 +31442,7 @@ return Component;]]> 2 - + false @@ -31187,7 +31503,7 @@ return Component;]]> 1 - + false @@ -31228,7 +31544,7 @@ return Component;]]> - + false @@ -31280,7 +31596,7 @@ return Component;]]> - + false @@ -31319,7 +31635,7 @@ return Component;]]> true 1 - + false @@ -31358,7 +31674,7 @@ return Component;]]> true 1 - + true @@ -31412,7 +31728,7 @@ return Component;]]> 2 - + false @@ -31452,7 +31768,7 @@ return Component;]]> 1 - + false @@ -31514,7 +31830,7 @@ return Component;]]> - + false @@ -31566,7 +31882,7 @@ return Component;]]> - + false @@ -31605,7 +31921,7 @@ return Component;]]> true 1 - + false @@ -31644,7 +31960,7 @@ return Component;]]> true 1 - + true @@ -31698,7 +32014,7 @@ return Component;]]> 2 - + false @@ -31759,7 +32075,7 @@ return Component;]]> 1 - + false @@ -31800,7 +32116,7 @@ return Component;]]> - + false @@ -31852,7 +32168,7 @@ return Component;]]> - + false @@ -31891,7 +32207,7 @@ return Component;]]> true 1 - + true @@ -31955,7 +32271,7 @@ return Component;]]> true 1 - + false @@ -31996,7 +32312,7 @@ return Component;]]> - + false @@ -32047,7 +32363,7 @@ return Component;]]> 1 - + false @@ -32086,7 +32402,7 @@ return Component;]]> true 1 - + false @@ -32126,7 +32442,7 @@ return Component;]]> 1 - + false @@ -32182,7 +32498,7 @@ return Component;]]> - + true @@ -32221,7 +32537,7 @@ return Component;]]> true 1 - + false @@ -32260,7 +32576,7 @@ return Component;]]> true 1 - + false @@ -32300,7 +32616,7 @@ return Component;]]> 1 - + false @@ -32351,7 +32667,7 @@ return Component;]]> 1 - + false @@ -32403,7 +32719,7 @@ return Component;]]> - + false @@ -32442,7 +32758,7 @@ return Component;]]> true 1 - + false @@ -32493,7 +32809,7 @@ return Component;]]> 1 - + true @@ -32547,7 +32863,7 @@ return Component;]]> true 1 - + false @@ -32608,7 +32924,7 @@ return Component;]]> 3 - + true @@ -32662,7 +32978,7 @@ return Component;]]> false 4 - + false @@ -32714,12 +33030,12 @@ return Component;]]> - + Options - + false @@ -32759,7 +33075,7 @@ return Component;]]> 1 - + false @@ -32810,7 +33126,7 @@ return Component;]]> 3 - + false @@ -32897,7 +33213,7 @@ return Component;]]> - + false @@ -32936,7 +33252,7 @@ return Component;]]> true 1 - + false @@ -32987,7 +33303,7 @@ return Component;]]> 1 - + false @@ -33026,7 +33342,7 @@ return Component;]]> true 1 - + false @@ -33087,7 +33403,7 @@ return Component;]]> 1 - + false @@ -33127,7 +33443,7 @@ return Component;]]> 1 - + true @@ -33183,7 +33499,7 @@ return Component;]]> - + false @@ -33222,7 +33538,7 @@ return Component;]]> true 1 - + false @@ -33273,7 +33589,7 @@ return Component;]]> 1 - + false @@ -33312,7 +33628,7 @@ return Component;]]> true 1 - + false @@ -33352,7 +33668,7 @@ return Component;]]> 1 - + false @@ -33413,7 +33729,7 @@ return Component;]]> 1 - + true @@ -33469,7 +33785,7 @@ return Component;]]> - + false @@ -33508,7 +33824,7 @@ return Component;]]> true 1 - + false @@ -33549,7 +33865,7 @@ return Component;]]> - + false @@ -33601,7 +33917,7 @@ return Component;]]> - + true @@ -33640,7 +33956,7 @@ return Component;]]> true 1 - + false @@ -33679,7 +33995,7 @@ return Component;]]> true 1 - + false @@ -33719,7 +34035,7 @@ return Component;]]> 1 - + false @@ -33770,7 +34086,7 @@ return Component;]]> 1 - + false @@ -33822,7 +34138,7 @@ return Component;]]> - + false @@ -33861,7 +34177,7 @@ return Component;]]> false 1 - + false @@ -33912,7 +34228,7 @@ return Component;]]> 1 - + true @@ -33966,7 +34282,7 @@ return Component;]]> true 1 - + false @@ -34027,7 +34343,7 @@ return Component;]]> 3 - + true @@ -34081,7 +34397,7 @@ return Component;]]> false 4 - + false @@ -34133,12 +34449,12 @@ return Component;]]> - + Options - + false @@ -34178,7 +34494,7 @@ return Component;]]> 1 - + false @@ -34229,7 +34545,7 @@ return Component;]]> 3 - + false @@ -34316,7 +34632,7 @@ return Component;]]> - + false @@ -34355,7 +34671,7 @@ return Component;]]> false 1 - + false @@ -34406,7 +34722,7 @@ return Component;]]> 1 - + false @@ -34445,7 +34761,7 @@ return Component;]]> true 1 - + false @@ -34506,7 +34822,7 @@ return Component;]]> 1 - + false @@ -34546,7 +34862,7 @@ return Component;]]> 1 - + true @@ -34601,7 +34917,7 @@ return Component;]]> - + false @@ -34640,7 +34956,7 @@ return Component;]]> true 1 - + false @@ -34701,7 +35017,7 @@ return Component;]]> 1 - + false @@ -34741,7 +35057,7 @@ return Component;]]> 1 - + true @@ -34796,7 +35112,7 @@ return Component;]]> - + false @@ -34835,7 +35151,7 @@ return Component;]]> true 1 - + false @@ -34896,7 +35212,7 @@ return Component;]]> 1 - + false @@ -34936,7 +35252,7 @@ return Component;]]> 1 - + true @@ -34992,7 +35308,7 @@ return Component;]]> - + false @@ -35031,7 +35347,7 @@ return Component;]]> false 1 - + true @@ -35086,7 +35402,7 @@ return Component;]]> 1 - + false @@ -35127,7 +35443,7 @@ return Component;]]> - + false @@ -35166,7 +35482,7 @@ return Component;]]> false 1 - + false @@ -35217,7 +35533,7 @@ return Component;]]> 1 - + true @@ -35271,7 +35587,7 @@ return Component;]]> 1 - + false @@ -35310,7 +35626,7 @@ return Component;]]> true 1 - + false @@ -35350,7 +35666,7 @@ return Component;]]> 1 - + false @@ -35390,7 +35706,7 @@ return Component;]]> 1 - + false @@ -35431,7 +35747,7 @@ return Component;]]> - + false @@ -35472,7 +35788,7 @@ return Component;]]> - + false @@ -35512,7 +35828,7 @@ return Component;]]> 1 - + false @@ -35551,7 +35867,7 @@ return Component;]]> false 1 - + false @@ -35602,7 +35918,7 @@ return Component;]]> 1 - + true @@ -35656,7 +35972,7 @@ return Component;]]> 1 - + false @@ -35695,7 +36011,7 @@ return Component;]]> true 1 - + false @@ -35735,7 +36051,7 @@ return Component;]]> 1 - + false @@ -35775,7 +36091,7 @@ return Component;]]> 1 - + false @@ -35816,7 +36132,7 @@ return Component;]]> - + false @@ -35857,7 +36173,7 @@ return Component;]]> - + false @@ -35896,7 +36212,7 @@ return Component;]]> false 1 - + true @@ -35951,7 +36267,7 @@ return Component;]]> 1 - + false @@ -35992,7 +36308,7 @@ return Component;]]> - + false @@ -36031,7 +36347,7 @@ return Component;]]> false 1 - + false @@ -36082,7 +36398,7 @@ return Component;]]> 1 - + false @@ -36121,7 +36437,7 @@ return Component;]]> true 1 - + false @@ -36161,7 +36477,7 @@ return Component;]]> 1 - + false @@ -36213,7 +36529,7 @@ return Component;]]> - + true @@ -36277,7 +36593,7 @@ return Component;]]> true 1 - + false @@ -36319,7 +36635,7 @@ return Component;]]> - + false @@ -36370,7 +36686,7 @@ return Component;]]> 1 - + false @@ -36409,7 +36725,7 @@ return Component;]]> false 1 - + false @@ -36460,7 +36776,7 @@ return Component;]]> 1 - + false @@ -36499,7 +36815,7 @@ return Component;]]> true 1 - + false @@ -36560,7 +36876,7 @@ return Component;]]> 1 - + false @@ -36600,7 +36916,7 @@ return Component;]]> 1 - + true @@ -36655,7 +36971,7 @@ return Component;]]> - + false @@ -36694,7 +37010,7 @@ return Component;]]> true 1 - + false @@ -36755,7 +37071,7 @@ return Component;]]> 1 - + false @@ -36795,7 +37111,7 @@ return Component;]]> 1 - + true @@ -36850,7 +37166,7 @@ return Component;]]> - + false @@ -36889,7 +37205,7 @@ return Component;]]> true 1 - + false @@ -36950,7 +37266,7 @@ return Component;]]> 1 - + false @@ -36990,7 +37306,7 @@ return Component;]]> 1 - + true @@ -37047,7 +37363,7 @@ return Component;]]> - + true @@ -37086,7 +37402,7 @@ return Component;]]> true 1 - + false @@ -37125,7 +37441,7 @@ return Component;]]> true 1 - + false @@ -37176,7 +37492,7 @@ return Component;]]> 1 - + false @@ -37217,7 +37533,7 @@ return Component;]]> - + false @@ -37256,7 +37572,7 @@ return Component;]]> false 1 - + false @@ -37295,7 +37611,7 @@ return Component;]]> true 1 - + false @@ -37334,7 +37650,7 @@ return Component;]]> true 1 - + false @@ -37395,7 +37711,7 @@ return Component;]]> 1 - + true @@ -37450,7 +37766,7 @@ return Component;]]> - + false @@ -37489,7 +37805,7 @@ return Component;]]> true 1 - + true @@ -37543,7 +37859,7 @@ return Component;]]> 2 - + false @@ -37605,7 +37921,7 @@ return Component;]]> - + false @@ -37644,7 +37960,7 @@ return Component;]]> true 1 - + true @@ -37698,7 +38014,7 @@ return Component;]]> 2 - + false @@ -37760,7 +38076,7 @@ return Component;]]> - + false @@ -37812,7 +38128,7 @@ return Component;]]> - + false @@ -37863,7 +38179,7 @@ return Component;]]> 1 - + false @@ -37904,7 +38220,7 @@ return Component;]]> - + false @@ -37943,7 +38259,7 @@ return Component;]]> true 1 - + false @@ -37982,7 +38298,7 @@ return Component;]]> true 1 - + false @@ -38034,7 +38350,7 @@ return Component;]]> - + false @@ -38073,7 +38389,7 @@ return Component;]]> true 1 - + false @@ -38134,7 +38450,7 @@ return Component;]]> 1 - + true @@ -38188,7 +38504,7 @@ return Component;]]> 2 - + false @@ -38230,7 +38546,7 @@ return Component;]]> - + false @@ -38269,7 +38585,7 @@ return Component;]]> true 1 - + false @@ -38320,7 +38636,7 @@ return Component;]]> 1 - + false @@ -38371,7 +38687,7 @@ return Component;]]> 1 - + false @@ -38412,7 +38728,7 @@ return Component;]]> - + false @@ -38451,7 +38767,7 @@ return Component;]]> true 1 - + false @@ -38490,7 +38806,7 @@ return Component;]]> true 1 - + false @@ -38542,7 +38858,7 @@ return Component;]]> - + false @@ -38581,7 +38897,7 @@ return Component;]]> true 1 - + false @@ -38632,7 +38948,7 @@ return Component;]]> 2 - + false @@ -38693,7 +39009,7 @@ return Component;]]> 1 - + true @@ -38748,7 +39064,7 @@ return Component;]]> 2 - + false @@ -38789,7 +39105,7 @@ return Component;]]> - + false @@ -38828,7 +39144,7 @@ return Component;]]> true 1 - + false @@ -38879,7 +39195,7 @@ return Component;]]> 2 - + false @@ -38940,7 +39256,7 @@ return Component;]]> 1 - + true @@ -38995,7 +39311,7 @@ return Component;]]> 2 - + false @@ -39036,7 +39352,7 @@ return Component;]]> - + false @@ -39075,7 +39391,7 @@ return Component;]]> true 1 - + false @@ -39126,7 +39442,7 @@ return Component;]]> 2 - + false @@ -39187,7 +39503,7 @@ return Component;]]> 1 - + true @@ -39242,7 +39558,7 @@ return Component;]]> 2 - + false @@ -39285,7 +39601,7 @@ return Component;]]> - + true @@ -39324,7 +39640,7 @@ return Component;]]> true 1 - + false @@ -39363,7 +39679,7 @@ return Component;]]> true 1 - + false @@ -39403,7 +39719,7 @@ return Component;]]> 1 - + false @@ -39454,7 +39770,7 @@ return Component;]]> 1 - + false @@ -39506,7 +39822,7 @@ return Component;]]> - + false @@ -39545,7 +39861,7 @@ return Component;]]> true 1 - + false @@ -39596,7 +39912,7 @@ return Component;]]> 1 - + true @@ -39650,7 +39966,7 @@ return Component;]]> true 1 - + false @@ -39711,7 +40027,7 @@ return Component;]]> 3 - + true @@ -39765,7 +40081,7 @@ return Component;]]> false 4 - + false @@ -39817,12 +40133,12 @@ return Component;]]> - + Options - + false @@ -39862,7 +40178,7 @@ return Component;]]> 1 - + false @@ -39913,7 +40229,7 @@ return Component;]]> 3 - + false @@ -40000,7 +40316,7 @@ return Component;]]> - + false @@ -40039,7 +40355,7 @@ return Component;]]> true 1 - + false @@ -40079,7 +40395,7 @@ return Component;]]> 1 - + false @@ -40132,7 +40448,7 @@ return Component;]]> - + true @@ -40171,7 +40487,7 @@ return Component;]]> true 1 - + false @@ -40210,7 +40526,7 @@ return Component;]]> true 1 - + false @@ -40250,7 +40566,7 @@ return Component;]]> 1 - + false @@ -40301,7 +40617,7 @@ return Component;]]> 1 - + false @@ -40353,7 +40669,7 @@ return Component;]]> - + false @@ -40393,7 +40709,7 @@ return Component;]]> 1 - + true @@ -40447,7 +40763,7 @@ return Component;]]> true 1 - + false @@ -40497,7 +40813,7 @@ return Component;]]> false 1 - + false @@ -40540,7 +40856,7 @@ return Component;]]> - + true @@ -40579,7 +40895,7 @@ return Component;]]> true 1 - + false @@ -40618,7 +40934,7 @@ return Component;]]> true 1 - + false @@ -40657,7 +40973,7 @@ return Component;]]> true 1 - + false @@ -40697,7 +41013,7 @@ return Component;]]> 1 - + true @@ -40752,7 +41068,7 @@ return Component;]]> 2 - + false @@ -40813,7 +41129,7 @@ return Component;]]> 1 - + false @@ -40865,7 +41181,7 @@ return Component;]]> - + false @@ -40904,7 +41220,7 @@ return Component;]]> true 1 - + false @@ -40944,7 +41260,7 @@ return Component;]]> 1 - + true @@ -40999,7 +41315,7 @@ return Component;]]> 2 - + false @@ -41060,7 +41376,7 @@ return Component;]]> 1 - + false @@ -41112,7 +41428,7 @@ return Component;]]> - + false @@ -41151,7 +41467,7 @@ return Component;]]> true 1 - + false @@ -41204,7 +41520,7 @@ return Component;]]> - + false @@ -41243,7 +41559,7 @@ return Component;]]> true 1 - + false @@ -41283,7 +41599,7 @@ return Component;]]> 1 - + false @@ -41334,7 +41650,7 @@ return Component;]]> 1 - + false @@ -41386,7 +41702,7 @@ return Component;]]> - + false @@ -41425,7 +41741,7 @@ return Component;]]> true 1 - + false @@ -41464,7 +41780,7 @@ return Component;]]> true 1 - + false @@ -41504,7 +41820,7 @@ return Component;]]> 1 - + true @@ -41558,7 +41874,7 @@ return Component;]]> 2 - + false @@ -41620,7 +41936,7 @@ return Component;]]> - + false @@ -41659,7 +41975,7 @@ return Component;]]> true 1 - + false @@ -41712,7 +42028,7 @@ return Component;]]> - + false @@ -41751,7 +42067,7 @@ return Component;]]> false 1 - + false @@ -41791,7 +42107,7 @@ return Component;]]> 1 - + false @@ -41842,7 +42158,7 @@ return Component;]]> 1 - + false @@ -41881,7 +42197,7 @@ return Component;]]> true 1 - + false @@ -41932,7 +42248,7 @@ return Component;]]> 1 - + false @@ -41971,7 +42287,7 @@ return Component;]]> true 1 - + true @@ -42025,7 +42341,7 @@ return Component;]]> 2 - + false @@ -42087,7 +42403,7 @@ return Component;]]> - + false @@ -42126,7 +42442,7 @@ return Component;]]> true 1 - + true @@ -42180,7 +42496,7 @@ return Component;]]> 2 - + false @@ -42242,7 +42558,7 @@ return Component;]]> - + false @@ -42281,7 +42597,7 @@ return Component;]]> true 1 - + true @@ -42335,7 +42651,7 @@ return Component;]]> 2 - + false @@ -42399,7 +42715,7 @@ return Component;]]> - + false @@ -42438,7 +42754,7 @@ return Component;]]> true 1 - + false @@ -42478,7 +42794,7 @@ return Component;]]> 1 - + false @@ -42531,7 +42847,7 @@ return Component;]]> - + true @@ -42570,7 +42886,7 @@ return Component;]]> true 1 - + false @@ -42609,7 +42925,7 @@ return Component;]]> true 1 - + false @@ -42648,7 +42964,7 @@ return Component;]]> true 1 - + false @@ -42688,7 +43004,7 @@ return Component;]]> 1 - + true @@ -42743,7 +43059,7 @@ return Component;]]> 2 - + false @@ -42804,7 +43120,7 @@ return Component;]]> 1 - + false @@ -42856,7 +43172,7 @@ return Component;]]> - + false @@ -42895,7 +43211,7 @@ return Component;]]> true 1 - + false @@ -42935,7 +43251,7 @@ return Component;]]> 1 - + true @@ -42990,7 +43306,7 @@ return Component;]]> 2 - + false @@ -43051,7 +43367,7 @@ return Component;]]> 1 - + false @@ -43103,7 +43419,7 @@ return Component;]]> - + false @@ -43142,7 +43458,7 @@ return Component;]]> true 1 - + false @@ -43182,7 +43498,7 @@ return Component;]]> 1 - + true @@ -43237,7 +43553,7 @@ return Component;]]> 2 - + false @@ -43298,7 +43614,7 @@ return Component;]]> 1 - + false @@ -43350,7 +43666,7 @@ return Component;]]> - + false @@ -43389,7 +43705,7 @@ return Component;]]> true 1 - + false @@ -43442,7 +43758,7 @@ return Component;]]> - + false @@ -43481,7 +43797,7 @@ return Component;]]> true 1 - + false @@ -43521,7 +43837,7 @@ return Component;]]> 1 - + false @@ -43572,7 +43888,7 @@ return Component;]]> 1 - + false @@ -43624,7 +43940,7 @@ return Component;]]> - + false @@ -43663,7 +43979,7 @@ return Component;]]> true 1 - + false @@ -43702,7 +44018,7 @@ return Component;]]> true 1 - + false @@ -43742,7 +44058,7 @@ return Component;]]> 1 - + true @@ -43796,7 +44112,7 @@ return Component;]]> 2 - + false @@ -43858,7 +44174,7 @@ return Component;]]> - + false @@ -43897,7 +44213,7 @@ return Component;]]> true 1 - + false @@ -43950,7 +44266,7 @@ return Component;]]> - + false @@ -43989,7 +44305,7 @@ return Component;]]> false 1 - + false @@ -44029,7 +44345,7 @@ return Component;]]> 1 - + false @@ -44080,7 +44396,7 @@ return Component;]]> 1 - + false @@ -44119,7 +44435,7 @@ return Component;]]> true 1 - + false @@ -44170,7 +44486,7 @@ return Component;]]> 1 - + false @@ -44209,7 +44525,7 @@ return Component;]]> true 1 - + true @@ -44263,7 +44579,7 @@ return Component;]]> 2 - + false @@ -44325,7 +44641,7 @@ return Component;]]> - + false @@ -44364,7 +44680,7 @@ return Component;]]> true 1 - + true @@ -44418,7 +44734,7 @@ return Component;]]> 2 - + false @@ -44480,7 +44796,7 @@ return Component;]]> - + false @@ -44519,7 +44835,7 @@ return Component;]]> true 1 - + true @@ -44573,7 +44889,7 @@ return Component;]]> 2 - + false @@ -44637,7 +44953,7 @@ return Component;]]> - + false @@ -44676,7 +44992,7 @@ return Component;]]> true 1 - + false @@ -44716,7 +45032,7 @@ return Component;]]> 1 - + false @@ -44769,7 +45085,7 @@ return Component;]]> - + true @@ -44808,7 +45124,7 @@ return Component;]]> true 1 - + false @@ -44847,7 +45163,7 @@ return Component;]]> true 1 - + false @@ -44887,7 +45203,7 @@ return Component;]]> 1 - + false @@ -44938,7 +45254,7 @@ return Component;]]> 1 - + false @@ -44990,7 +45306,7 @@ return Component;]]> - + false @@ -45029,7 +45345,7 @@ return Component;]]> true 1 - + false @@ -45080,7 +45396,7 @@ return Component;]]> 1 - + true @@ -45134,7 +45450,7 @@ return Component;]]> true 1 - + false @@ -45195,7 +45511,7 @@ return Component;]]> 3 - + true @@ -45249,7 +45565,7 @@ return Component;]]> false 4 - + false @@ -45301,12 +45617,12 @@ return Component;]]> - + Options - + false @@ -45346,7 +45662,7 @@ return Component;]]> 1 - + false @@ -45397,7 +45713,7 @@ return Component;]]> 3 - + false @@ -45484,7 +45800,7 @@ return Component;]]> - + false @@ -45523,7 +45839,7 @@ return Component;]]> true 1 - + false @@ -45574,7 +45890,7 @@ return Component;]]> 1 - + true @@ -45628,7 +45944,7 @@ return Component;]]> true 1 - + false @@ -45689,7 +46005,7 @@ return Component;]]> 3 - + true @@ -45743,7 +46059,7 @@ return Component;]]> false 4 - + false @@ -45795,12 +46111,12 @@ return Component;]]> - + Options - + false @@ -45840,7 +46156,7 @@ return Component;]]> 1 - + false @@ -45891,7 +46207,7 @@ return Component;]]> 3 - + false @@ -45978,7 +46294,7 @@ return Component;]]> - + false @@ -46017,7 +46333,7 @@ return Component;]]> true 1 - + false @@ -46057,7 +46373,7 @@ return Component;]]> 1 - + false @@ -46110,7 +46426,7 @@ return Component;]]> - + true @@ -46149,7 +46465,7 @@ return Component;]]> true 1 - + false @@ -46188,7 +46504,7 @@ return Component;]]> true 1 - + false @@ -46228,7 +46544,7 @@ return Component;]]> 1 - + false @@ -46279,7 +46595,7 @@ return Component;]]> 1 - + false @@ -46331,7 +46647,7 @@ return Component;]]> - + false @@ -46370,7 +46686,7 @@ return Component;]]> true 1 - + false @@ -46421,7 +46737,7 @@ return Component;]]> 1 - + true @@ -46475,7 +46791,7 @@ return Component;]]> true 1 - + false @@ -46536,7 +46852,7 @@ return Component;]]> 3 - + true @@ -46590,7 +46906,7 @@ return Component;]]> false 4 - + false @@ -46642,12 +46958,12 @@ return Component;]]> - + Options - + false @@ -46687,7 +47003,7 @@ return Component;]]> 1 - + false @@ -46738,7 +47054,7 @@ return Component;]]> 3 - + false @@ -46825,7 +47141,7 @@ return Component;]]> - + false @@ -46864,7 +47180,7 @@ return Component;]]> false 1 - + false @@ -46915,7 +47231,7 @@ return Component;]]> 1 - + false @@ -46954,7 +47270,7 @@ return Component;]]> true 1 - + false @@ -47015,7 +47331,7 @@ return Component;]]> 1 - + false @@ -47055,7 +47371,7 @@ return Component;]]> 1 - + true @@ -47110,7 +47426,7 @@ return Component;]]> - + false @@ -47149,7 +47465,7 @@ return Component;]]> true 1 - + false @@ -47210,7 +47526,7 @@ return Component;]]> 1 - + false @@ -47250,7 +47566,7 @@ return Component;]]> 1 - + true @@ -47306,7 +47622,7 @@ return Component;]]> - + false @@ -47346,7 +47662,7 @@ return Component;]]> 1 - + false @@ -47385,7 +47701,7 @@ return Component;]]> true 1 - + false @@ -47436,7 +47752,7 @@ return Component;]]> 1 - + false @@ -47475,7 +47791,7 @@ return Component;]]> true 1 - + false @@ -47536,7 +47852,7 @@ return Component;]]> 1 - + false @@ -47576,7 +47892,7 @@ return Component;]]> 1 - + true @@ -47632,7 +47948,7 @@ return Component;]]> - + false @@ -47671,7 +47987,7 @@ return Component;]]> true 1 - + false @@ -47722,7 +48038,7 @@ return Component;]]> 1 - + false @@ -47761,7 +48077,7 @@ return Component;]]> true 1 - + false @@ -47801,7 +48117,7 @@ return Component;]]> 1 - + true @@ -47856,7 +48172,7 @@ return Component;]]> 2 - + false @@ -47917,7 +48233,7 @@ return Component;]]> 1 - + false @@ -47969,7 +48285,7 @@ return Component;]]> - + false @@ -48008,7 +48324,7 @@ return Component;]]> true 1 - + true @@ -48063,7 +48379,7 @@ return Component;]]> 2 - + false @@ -48124,7 +48440,7 @@ return Component;]]> 1 - + false @@ -48175,7 +48491,7 @@ return Component;]]> 1 - + false @@ -48217,7 +48533,7 @@ return Component;]]> - + false @@ -48256,7 +48572,7 @@ return Component;]]> true 1 - + false @@ -48307,7 +48623,7 @@ return Component;]]> 1 - + false @@ -48346,7 +48662,7 @@ return Component;]]> true 1 - + false @@ -48386,7 +48702,7 @@ return Component;]]> 1 - + false @@ -48426,7 +48742,7 @@ return Component;]]> 1 - + false @@ -48467,7 +48783,7 @@ return Component;]]> - + false @@ -48507,7 +48823,7 @@ return Component;]]> 1 - + true @@ -48562,7 +48878,7 @@ return Component;]]> - + false @@ -48601,7 +48917,7 @@ return Component;]]> false 1 - + true @@ -48656,7 +48972,7 @@ return Component;]]> 1 - + false @@ -48697,7 +49013,7 @@ return Component;]]> - + false @@ -48736,7 +49052,7 @@ return Component;]]> true 1 - + true @@ -48791,7 +49107,7 @@ return Component;]]> 1 - + false @@ -48832,7 +49148,7 @@ return Component;]]> - + false @@ -48884,7 +49200,7 @@ return Component;]]> - + true @@ -48923,7 +49239,7 @@ return Component;]]> true 1 - + false @@ -48962,7 +49278,7 @@ return Component;]]> true 1 - + false @@ -49002,7 +49318,7 @@ return Component;]]> 1 - + false @@ -49053,7 +49369,7 @@ return Component;]]> 1 - + false @@ -49105,7 +49421,7 @@ return Component;]]> - + false @@ -49144,7 +49460,7 @@ return Component;]]> true 1 - + true @@ -49198,7 +49514,7 @@ return Component;]]> true 1 - + false @@ -49239,7 +49555,7 @@ return Component;]]> - + true @@ -49293,7 +49609,7 @@ return Component;]]> true 1 - + false @@ -49335,7 +49651,7 @@ return Component;]]> - + false @@ -49374,7 +49690,7 @@ return Component;]]> true 1 - + false @@ -49414,7 +49730,7 @@ return Component;]]> 1 - + false @@ -49467,127 +49783,7 @@ return Component;]]> - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - PointMarker - null - null - null - null - - 0 - 200 - 0 - 200 - - 0 - false - null - - 0.0125000002 - 0 - 0.0125000002 - 0 - - 1 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - 45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - -45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - + true @@ -49626,7 +49822,7 @@ return Component;]]> false 1 - + false @@ -49665,7 +49861,7 @@ return Component;]]> false 1 - + false @@ -49716,7 +49912,7 @@ return Component;]]> 1 - + false @@ -49767,7 +49963,7 @@ return Component;]]> 1 - + false @@ -49806,7 +50002,7 @@ return Component;]]> true 1 - + false @@ -49846,7 +50042,7 @@ return Component;]]> 1 - + false @@ -49886,7 +50082,7 @@ return Component;]]> 1 - + false @@ -49926,7 +50122,7 @@ return Component;]]> 1 - + false @@ -49966,7 +50162,7 @@ return Component;]]> 1 - + false @@ -50008,7 +50204,7 @@ return Component;]]> - + false @@ -50047,7 +50243,7 @@ return Component;]]> false 1 - + false @@ -50098,7 +50294,7 @@ return Component;]]> 1 - + false @@ -50137,7 +50333,7 @@ return Component;]]> true 1 - + false @@ -50177,7 +50373,7 @@ return Component;]]> 1 - + false @@ -50217,7 +50413,7 @@ return Component;]]> 1 - + false @@ -50257,7 +50453,7 @@ return Component;]]> 1 - + false @@ -50297,7 +50493,7 @@ return Component;]]> 1 - + false @@ -50339,7 +50535,7 @@ return Component;]]> - + false @@ -50378,7 +50574,7 @@ return Component;]]> false 1 - + true @@ -50433,7 +50629,7 @@ return Component;]]> 1 - + false @@ -50474,7 +50670,7 @@ return Component;]]> - + false @@ -50513,7 +50709,7 @@ return Component;]]> true 1 - + false @@ -50552,7 +50748,7 @@ return Component;]]> true 1 - + false @@ -50592,7 +50788,7 @@ return Component;]]> 1 - + false @@ -50632,7 +50828,7 @@ return Component;]]> 1 - + false @@ -50672,7 +50868,7 @@ return Component;]]> 1 - + false @@ -50712,7 +50908,7 @@ return Component;]]> 1 - + false @@ -50753,7 +50949,7 @@ return Component;]]> - + false @@ -50804,7 +51000,7 @@ return Component;]]> 1 - + false @@ -50843,7 +51039,7 @@ return Component;]]> true 1 - + false @@ -50883,7 +51079,7 @@ return Component;]]> 1 - + false @@ -50923,7 +51119,7 @@ return Component;]]> 1 - + false @@ -50963,7 +51159,7 @@ return Component;]]> 1 - + false @@ -51003,7 +51199,7 @@ return Component;]]> 1 - + false @@ -51044,7 +51240,7 @@ return Component;]]> - + true @@ -51098,7 +51294,7 @@ return Component;]]> true 1 - + false @@ -51140,7 +51336,7 @@ return Component;]]> - + false @@ -51218,7 +51414,7 @@ return Component;]]> - + false @@ -51257,7 +51453,7 @@ return Component;]]> false 1 - + false @@ -51296,7 +51492,7 @@ return Component;]]> false 1 - + false @@ -51336,7 +51532,7 @@ return Component;]]> 1 - + true @@ -51391,7 +51587,7 @@ return Component;]]> 1 - + true @@ -51446,7 +51642,7 @@ return Component;]]> 1 - + false @@ -51486,7 +51682,7 @@ return Component;]]> 1 - + false @@ -51525,7 +51721,7 @@ return Component;]]> true 1 - + false @@ -51576,14 +51772,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -51622,7 +51818,7 @@ return Component;]]> false 1 - + false @@ -51673,13 +51869,13 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -51731,7 +51927,7 @@ return Component;]]> - + false @@ -51786,7 +51982,7 @@ return Component;]]> - + false @@ -51825,7 +52021,7 @@ return Component;]]> false 1 - + false @@ -51865,7 +52061,7 @@ return Component;]]> 1 - + true @@ -51920,7 +52116,7 @@ return Component;]]> 1 - + true @@ -51975,7 +52171,7 @@ return Component;]]> 1 - + false @@ -52015,7 +52211,7 @@ return Component;]]> 1 - + false @@ -52054,7 +52250,7 @@ return Component;]]> true 1 - + false @@ -52105,14 +52301,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -52151,7 +52347,7 @@ return Component;]]> false 1 - + false @@ -52202,14 +52398,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52264,7 +52460,7 @@ return Component;]]> - + false @@ -52303,7 +52499,7 @@ return Component;]]> false 1 - + false @@ -52343,7 +52539,7 @@ return Component;]]> 1 - + true @@ -52398,7 +52594,7 @@ return Component;]]> 1 - + true @@ -52453,7 +52649,7 @@ return Component;]]> 1 - + false @@ -52493,7 +52689,7 @@ return Component;]]> 1 - + false @@ -52532,7 +52728,7 @@ return Component;]]> true 1 - + false @@ -52583,14 +52779,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52629,7 +52825,7 @@ return Component;]]> false 1 - + false @@ -52680,7 +52876,7 @@ return Component;]]> 1 - + false @@ -52731,14 +52927,14 @@ return Component;]]> 1 - + NotificationSize 110 - + false @@ -52793,7 +52989,7 @@ return Component;]]> - + 1 1 @@ -52806,7 +53002,7 @@ return Component;]]> 0 - + false @@ -52867,7 +53063,487 @@ return Component;]]> - + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLineSegment + null + null + null + null + + 0 + 300 + 0 + 100 + + 0 + false + null + + 0 + 50 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarkerA + null + null + null + null + + 0 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 16 + 0 + 16 + + 2 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0 + 200 + 0 + 200 + + 0 + false + null + + 0.0149999997 + 0 + 0.0149999997 + 0 + + 1 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + + false + + 0.5 + 0 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLine + null + null + null + null + + 0 + 100 + 0 + 100 + + -45 + false + null + + 3 + 0 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0 + 0.5 + + 4280649727 + 0 + 4279970357 + 0 + false + false + 0 + SnapProgress + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 100 + 2 + 0 + + 0 + 0 + true + 2 + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0.00499999989 + 0 + 0.00499999989 + 0 + + 1 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + true @@ -52906,7 +53582,7 @@ return Component;]]> true 1 - + false @@ -52945,7 +53621,7 @@ return Component;]]> true 1 - + false @@ -52996,7 +53672,7 @@ return Component;]]> 1 - + true @@ -53060,7 +53736,7 @@ return Component;]]> true 1 - + false @@ -53110,7 +53786,7 @@ return Component;]]> false 10 - + false @@ -53170,7 +53846,7 @@ return Component.Start();]]> - + false @@ -53211,7 +53887,7 @@ return Component.Start();]]> - + false @@ -53251,7 +53927,7 @@ return Component.Start();]]> 1 - + false @@ -53291,7 +53967,7 @@ return Component.Start();]]> 1 - + false @@ -53330,7 +54006,7 @@ return Component.Start();]]> false 1 - + false @@ -53369,7 +54045,7 @@ return Component.Start();]]> true 1 - + false @@ -53409,7 +54085,7 @@ return Component.Start();]]> 1 - + false @@ -53449,7 +54125,7 @@ return Component.Start();]]> 1 - + false @@ -53489,7 +54165,7 @@ return Component.Start();]]> 1 - + false @@ -53529,7 +54205,7 @@ return Component.Start();]]> 1 - + false @@ -53570,7 +54246,7 @@ return Component.Start();]]> - + false @@ -53623,7 +54299,7 @@ return Component.Start();]]> true 1 - + false @@ -53662,7 +54338,7 @@ return Component.Start();]]> true 1 - + false @@ -53702,7 +54378,7 @@ return Component.Start();]]> 1 - + false @@ -53742,7 +54418,7 @@ return Component.Start();]]> 1 - + false @@ -53782,7 +54458,7 @@ return Component.Start();]]> 1 - + false @@ -53822,7 +54498,7 @@ return Component.Start();]]> 1 - + false @@ -53863,7 +54539,7 @@ return Component.Start();]]> - + false @@ -53902,7 +54578,7 @@ return Component.Start();]]> true 1 - + false @@ -53957,7 +54633,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54009,7 +54685,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54048,7 +54724,7 @@ roblox.com/library/142485815/import]]> true 1 - + false @@ -54105,7 +54781,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54157,7 +54833,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54208,7 +54884,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54261,7 +54937,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54311,7 +54987,7 @@ roblox.com/library/142485815/import]]> false 10 - + false @@ -54375,7 +55051,7 @@ return Component;]]> - + true @@ -54440,7 +55116,7 @@ return Component;]]> 1 - + true @@ -54504,7 +55180,7 @@ return Component;]]> false 1 - + false @@ -54556,7 +55232,7 @@ return Component;]]> - + false @@ -54698,7 +55374,7 @@ Component.Ready = true; return Component;]]> - + false @@ -54737,7 +55413,7 @@ return Component;]]> true 1 - + false @@ -54776,7 +55452,7 @@ return Component;]]> false 1 - + false @@ -54815,7 +55491,7 @@ return Component;]]> true 1 - + false @@ -54855,7 +55531,7 @@ return Component;]]> 1 - + false @@ -54908,7 +55584,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -54961,7 +55637,7 @@ TIP: Press R while hovering over a part to copy its color.]]> - + false @@ -55000,7 +55676,7 @@ TIP: Press R while hovering over a part to copy its color.]]> false 1 - + false @@ -55039,7 +55715,7 @@ TIP: Press R while hovering over a part to copy its color.]]> true 1 - + false @@ -55079,7 +55755,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -55132,7 +55808,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55185,7 +55861,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55224,7 +55900,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55263,7 +55939,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55303,7 +55979,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55354,7 +56030,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55407,7 +56083,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55446,7 +56122,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55485,7 +56161,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55525,7 +56201,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55578,7 +56254,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55631,7 +56307,7 @@ TIP: Press Enter to toggle anchor quickly.]]> - + false @@ -55670,7 +56346,7 @@ TIP: Press Enter to toggle anchor quickly.]]> false 1 - + false @@ -55709,7 +56385,7 @@ TIP: Press Enter to toggle anchor quickly.]]> true 1 - + false @@ -55749,7 +56425,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55802,7 +56478,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -55855,7 +56531,7 @@ TIP: Click and drag where you want your part to be.]]> - + false @@ -55894,7 +56570,7 @@ TIP: Click and drag where you want your part to be.]]> false 1 - + false @@ -55933,7 +56609,7 @@ TIP: Click and drag where you want your part to be.]]> true 1 - + false @@ -55973,7 +56649,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -56028,7 +56704,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56081,7 +56757,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di - + false @@ -56120,7 +56796,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di false 1 - + false @@ -56159,7 +56835,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di true 1 - + false @@ -56199,7 +56875,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56256,7 +56932,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56309,7 +56985,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]> - + false @@ -56348,7 +57024,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>false 1 - + false @@ -56387,7 +57063,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>true 1 - + false @@ -56427,7 +57103,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56480,7 +57156,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56533,7 +57209,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -56572,7 +57248,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56611,7 +57287,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56651,7 +57327,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56702,7 +57378,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56755,7 +57431,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -56769,7 +57445,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false false 0 - MoveInfo + WeldInfo null null null @@ -56794,7 +57470,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56805,21 +57481,9 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 4279970357 0 - rbxasset://textures/ui/Scroll/scroll-bottom.png - - 0 - 0 - - - 0 - 0 - 0 - 660 - - true + false false 0 - rbxasset://textures/ui/Scroll/scroll-middle.png Content null null @@ -56832,317 +57496,27 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>0 0 - 6 - true - true + false null 1 0 - 1 - 0 + 0 + 310 0 - rbxasset://textures/ui/Scroll/scroll-top.png + 0 true 1 - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - AxesInfo - null - null - null - null - - 0 - 0 - 0 - 60 - - 0 - false - null - - 1 - 0 - 0 - 300 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294945280 - 0 - 4279970357 - 0 - false - false - 0 - Frame - null - null - null - null - - 0 - 10 - 0 - 68 - - 0 - false - null - - 0 - 2 - 0 - 103 - - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 17 - 0 - 68 - - 0 - false - null - - 0 - 80 - 0 - 180 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 15 - - 0 - false - null - - 0 - 80 - 0 - 60 - - 0 - This option lets you choose in which direction to move each part. - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4282203453 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 80 - 0 - 12 - - 0 - Axes - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 180 - - 0 - false - null - - 0 - 80 - 0 - 90 - - 0 - TIP: Click on any part to focus the handles on it. - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - + false 0 0 - 4294945280 + 4279308561 0 4279970357 0 @@ -57175,157 +57549,7 @@ LAST - Relative to the last part selected]]> 1 - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - IncrementInfo - null - null - null - null - - 0 - 0 - 0 - 285 - - 0 - false - null - - 1 - 0 - 0 - 300 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 15 - - 0 - false - null - - 0 - 80 - 0 - 400 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4282203453 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 80 - 0 - 12 - - 0 - Increment - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - + false @@ -57357,12 +57581,16 @@ TIP: Hit the - key to quickly type increments.]]> null 0 - 80 + 90 0 - 50 + 300 0 - Allows you to move parts. + 4294967295 false 10 @@ -57376,7 +57604,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57413,7 +57641,7 @@ TIP: Hit the - key to quickly type increments.]]> 25 0 - MOVE TOOL + WELD TOOL 4294967295 false 10 @@ -57429,7 +57657,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -57443,7 +57671,7 @@ TIP: Hit the - key to quickly type increments.]]> false false 0 - RotateInfo + CollisionInfo null null null @@ -57468,7 +57696,7 @@ TIP: Hit the - key to quickly type increments.]]> false 1 - + false @@ -57479,21 +57707,9 @@ TIP: Hit the - key to quickly type increments.]]> 1 4279970357 0 - rbxasset://textures/ui/Scroll/scroll-bottom.png - - 0 - 0 - - - 0 - 0 - 0 - 610 - - true + false false 0 - rbxasset://textures/ui/Scroll/scroll-middle.png Content null null @@ -57506,29 +57722,27 @@ TIP: Hit the - key to quickly type increments.]]> 0 0 - 6 - true - true + false null 1 0 - 1 - 0 + 0 + 150 0 - rbxasset://textures/ui/Scroll/scroll-top.png + 0 true 1 - + false 0 0 - 4283144011 + 4279308561 0 4279970357 0 @@ -57561,7 +57775,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57574,147 +57788,353 @@ TIP: Hit the - key to quickly type increments.]]> 0 false false + 1 + 2 0 - IncrementInfo + ToolDescription null null null null 0 - 0 + 10 0 - 310 + 25 0 false null - 1 - 0 + 0 + 80 0 - 130 + 120 0 - 0 - true - 1 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 15 - - 0 - false - null - - 0 - 93 - 0 - 400 - - 0 - + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + COLLISION TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + + + false + + [Component] + {0D39C82F-7AFE-4159-8AA9-E071F3CDB35B} + - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4282203453 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 80 - 0 - 12 - - 0 - Increment - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - +function Component.Start(Core) + + -- Save reference to core API + getfenv(1).Core = Core; + + -- Return component for chaining + return Component; + +end; + +function Component.RegisterSection(SectionName) + -- Registers triggers for the given section + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Reset fade timer on hover + Cheer.Bind(Section.MouseEnter, function () + if Component.CurrentSection == Section then + Component.CurrentFadeTimer = false; + end; + end); + + -- Start fade time on unhover + Cheer.Bind(Section.MouseLeave, function () + Component.StartFadeTimer(true); + end); + +end; + +function Component.StartFadeTimer(Override) + -- Creates timer to disappear current section after 2 seconds unless overridden + + if Component.CurrentFadeTimer == false and not Override then + return; + end; + + -- Generate unique trigger ID + local TriggerId = HttpService:GenerateGUID(); + + -- Register timer + Component.CurrentFadeTimer = TriggerId; + + -- Start timer + Delay(2, function () + if Component.CurrentFadeTimer == TriggerId then + Component.HideCurrentSection(); + end; + end); + +end; + +function Component.ProcessHover(Tool, SectionName) + + -- Only override current section if also triggered by hover + if Component.LastTrigger == 'Click' then + return; + end; + + -- Hide any current section + Component.HideCurrentSection(); + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Set new current section + Component.CurrentSection = Section; + Component.LastTrigger = 'Hover'; + + -- Show the new section + Section.Visible = true; + +end; + +function Component.ProcessUnhover(Tool, SectionName) + + -- Only override current section if triggered by a hover + if Component.LastTrigger == 'Click' then + return; + end; + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Disappear after 2 seconds unless overridden + if Component.CurrentSection == Section then + Component.StartFadeTimer(); + end; + +end; + +function Component.ProcessClick(Tool, SectionName) + + -- Hide any current section + Component.HideCurrentSection(); + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Set new current section + Component.CurrentSection = Section; + Component.LastTrigger = 'Click'; + + -- Show the new section + Section.Visible = true; + + -- Disappear after 2 seconds unless overridden + Component.StartFadeTimer(); + +end; + +function Component.HideCurrentSection() + + -- Ensure there is a current section + if not Component.CurrentSection then + return; + end; + + -- Hide section + Component.CurrentSection.Visible = false; + + -- Disable section fade timer if any + Component.CurrentFadeTimer = nil; + + -- Unregister current section + Component.CurrentSection = nil; + Component.LastTrigger = nil; + +end; + +function Component.GetSection(SectionName) + + -- Return the information section with the given name + return View:FindFirstChild(SectionName); + +end; + +return Component;]]> + + + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + MoveInfo + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 1 + 0 + + 0 + 0 + false + 1 + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + rbxasset://textures/ui/Scroll/scroll-bottom.png + + 0 + 0 + + + 0 + 0 + 0 + 660 + + true + false + 0 + rbxasset://textures/ui/Scroll/scroll-middle.png + Content + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + 6 + true + true + null + + 1 + 0 + 1 + 0 + + 0 + rbxasset://textures/ui/Scroll/scroll-top.png + true + 1 + + false @@ -57728,7 +58148,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen false false 0 - PivotInfo + AxesInfo null null null @@ -57753,14 +58173,14 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen true 1 - + false 0 0 - 4283144011 + 4294945280 0 4279970357 0 @@ -57776,7 +58196,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 0 10 0 - 67 + 68 0 false @@ -57785,7 +58205,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 0 2 0 - 132 + 103 0 0 @@ -57793,7 +58213,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -57818,7 +58238,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 0 17 0 - 67 + 68 0 false @@ -57830,11 +58250,11 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 180 0 - +LAST - Relative to the last part selected]]> 4294967295 false 10 @@ -57848,7 +58268,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57885,7 +58305,7 @@ LAST - Each part around the center of the last part selected]]> 60 0 - This option lets you choose what to rotate the parts around. + This option lets you choose in which direction to move each part. 4294967295 false 10 @@ -57899,7 +58319,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57936,7 +58356,7 @@ LAST - Each part around the center of the last part selected]]> 12 0 - Pivot + Axes 4294967295 false 10 @@ -57950,7 +58370,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57975,7 +58395,7 @@ LAST - Each part around the center of the last part selected]]> 0 10 0 - 208 + 180 0 false @@ -58002,58 +58422,47 @@ LAST - Each part around the center of the last part selected]]> - + false 0 0 - 4294967295 - 1 + 4294945280 + 0 4279970357 0 false false - 1 - 2 0 - ToolDescription + ColorBar null null null null 0 - 10 + 0 0 - 25 + 0 0 false null - 0 - 80 + 1 + 0 0 - 50 + 2 0 - Allows you to rotate parts. - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 + 0 true 1 - + false @@ -58066,64 +58475,269 @@ LAST - Each part around the center of the last part selected]]> 0 false false - 2 - 2 0 - ToolName + IncrementInfo null null null null 0 - 10 + 0 0 - 0 + 285 0 false null - 0 - 50 + 1 + 0 0 - 25 + 300 0 - ROTATE TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 + 0 true 1 - - - - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - ResizeInfo - null - null - null + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 82 + 0 + 400 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4282203453 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 80 + 0 + 12 + + 0 + Increment + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + ToolDescription + null + null + null + null + + 0 + 10 + 0 + 25 + + 0 + false + null + + 0 + 80 + 0 + 50 + + 0 + Allows you to move parts. + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + MOVE TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + RotateInfo + null + null + null null 0 @@ -58145,7 +58759,7 @@ LAST - Each part around the center of the last part selected]]> false 1 - + false @@ -58165,7 +58779,7 @@ LAST - Each part around the center of the last part selected]]> 0 0 0 - 525 + 630 true false @@ -58198,14 +58812,14 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false 0 0 - 4278497260 + 4283144011 0 4279970357 0 @@ -58238,7 +58852,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -58252,7 +58866,7 @@ LAST - Each part around the center of the last part selected]]> false false 0 - DirectionsInfo + IncrementInfo null null null @@ -58261,7 +58875,7 @@ LAST - Each part around the center of the last part selected]]> 0 0 0 - 60 + 310 0 false @@ -58270,14 +58884,14 @@ LAST - Each part around the center of the last part selected]]> 1 0 0 - 300 + 130 0 0 true 1 - + false @@ -58309,14 +58923,24 @@ LAST - Each part around the center of the last part selected]]> null 0 - 80 + 94 0 - 120 + 400 0 - +TIP: Hit the Enter key to switch between Pivot modes quickly. + +TIP: Hit the - key to quickly type increments. + +TIP: Hold R and click on a corner of a part to rotate around it. + +TIP: Use your right-side number keypad to rotate exactly by the current increment: + 4/6 = Y axis (green) + 1/9 = Z axis (blue) + 2/8 = X axis (red) +(Shift = reverses increment)]]> 4294967295 false 10 @@ -58330,7 +58954,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58367,7 +58991,7 @@ TIP: Click on a part to focus the handles on it.]]> 12 0 - Directions + Increment 4294967295 false 10 @@ -58382,7 +59006,7 @@ TIP: Click on a part to focus the handles on it.]]> - + false @@ -58396,7 +59020,7 @@ TIP: Click on a part to focus the handles on it.]]> false false 0 - IncrementInfo + PivotInfo null null null @@ -58405,7 +59029,7 @@ TIP: Click on a part to focus the handles on it.]]> 0 0 0 - 165 + 60 0 false @@ -58414,14 +59038,160 @@ TIP: Click on a part to focus the handles on it.]]> 1 0 0 - 135 + 300 0 0 true 1 - + + + false + + 0 + 0 + + 4283144011 + 0 + 4279970357 + 0 + false + false + 0 + Frame + null + null + null + null + + 0 + 10 + 0 + 67 + + 0 + false + null + + 0 + 2 + 0 + 132 + + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 17 + 0 + 67 + + 0 + false + null + + 0 + 80 + 0 + 180 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 80 + 0 + 60 + + 0 + This option lets you choose what to rotate the parts around. + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + false @@ -58458,7 +59228,7 @@ TIP: Click on a part to focus the handles on it.]]> 12 0 - Increment + Pivot 4294967295 false 10 @@ -58472,7 +59242,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58497,7 +59267,7 @@ TIP: Click on a part to focus the handles on it.]]> 0 10 0 - 15 + 208 0 false @@ -58506,18 +59276,10 @@ TIP: Click on a part to focus the handles on it.]]> 0 80 0 - 400 + 90 0 - + TIP: Click on any part to focus the handles on it. 4294967295 false 10 @@ -58532,7 +59294,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -58569,7 +59331,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 50 0 - Allows you to resize parts. + Allows you to rotate parts. 4294967295 false 10 @@ -58583,7 +59345,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -58620,7 +59382,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 25 0 - RESIZE TOOL + ROTATE TOOL 4294967295 false 10 @@ -58636,7 +59398,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -58650,7 +59412,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi false false 0 - WeldInfo + ResizeInfo null null null @@ -58675,7 +59437,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi false 1 - + false @@ -58686,9 +59448,21 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 4279970357 0 - false + rbxasset://textures/ui/Scroll/scroll-bottom.png + + 0 + 0 + + + 0 + 0 + 0 + 540 + + true false 0 + rbxasset://textures/ui/Scroll/scroll-middle.png Content null null @@ -58701,27 +59475,29 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 0 0 - false + 6 + true + true null 1 0 - 0 - 310 + 1 + 0 0 - 0 + rbxasset://textures/ui/Scroll/scroll-top.png true 1 - + false 0 0 - 4279308561 + 4278497260 0 4279970357 0 @@ -58754,7 +59530,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -58767,49 +59543,138 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 0 false false - 1 - 2 0 - ToolDescription + DirectionsInfo null null null null 0 - 10 + 0 0 - 25 + 60 0 false null - 0 - 90 + 1 + 0 0 300 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 + 0 true 1 + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 80 + 0 + 120 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4282203453 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 80 + 0 + 12 + + 0 + Directions + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + - + false @@ -58822,139 +59687,8 @@ NOTE: This tool does not work in Roblox Studio.]]> 0 false false - 2 - 2 0 - ToolName - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 50 - 0 - 25 - - 0 - WELD TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 - true - 1 - - - - - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - CollisionInfo - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - false - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - Content - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 150 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4279308561 - 0 - 4279970357 - 0 - false - false - 0 - ColorBar + IncrementInfo null null null @@ -58963,7 +59697,7 @@ NOTE: This tool does not work in Roblox Studio.]]> 0 0 0 - 0 + 165 0 false @@ -58972,15 +59706,129 @@ NOTE: This tool does not work in Roblox Studio.]]> 1 0 0 - 2 + 135 0 0 true 1 + + + false + + 0 + 0 + + 4282203453 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 80 + 0 + 12 + + 0 + Increment + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 82 + 0 + 400 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + - + false @@ -59014,12 +59862,10 @@ NOTE: This tool does not work in Roblox Studio.]]> 0 80 0 - 120 + 50 0 - + Allows you to resize parts. 4294967295 false 10 @@ -59033,7 +59879,7 @@ TIP: Press Enter to toggle collision quickly.]]> 1 - + false @@ -59070,7 +59916,7 @@ TIP: Press Enter to toggle collision quickly.]]> 25 0 - COLLISION TOOL + RESIZE TOOL 4294967295 false 10 @@ -59086,177 +59932,16 @@ TIP: Press Enter to toggle collision quickly.]]> - - - false - - [Component] - {0D39C82F-7AFE-4159-8AA9-E071F3CDB35B} - - - - + AutoUpdate true - + false @@ -59318,7 +60003,7 @@ if Model and #Model:GetChildren() > 0 then end;]]> - + -9.0008564 @@ -59355,7 +60040,7 @@ end;]]> 1 ThumbnailCamera - + true -0.5 @@ -59426,7 +60111,7 @@ end;]]> 0.200000003 - + true null @@ -59441,7 +60126,7 @@ end;]]> 0 0 - + false @@ -59503,7 +60188,7 @@ end;]]> - + false diff --git a/tools/Move.lua b/tools/Move.lua index f040a0a..bfc7613 100644 --- a/tools/Move.lua +++ b/tools/Move.lua @@ -103,7 +103,7 @@ function ShowUI() local IncrementInput = MoveTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) MoveTool.Increment = tonumber(IncrementInput.Text) or MoveTool.Increment; - IncrementInput.Text = Support.Round(MoveTool.Increment, 3); + IncrementInput.Text = Support.Round(MoveTool.Increment, 4); end); -- Add functionality to the position inputs @@ -305,8 +305,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and dragging is ongoing + if not HandleDragging or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -461,8 +461,8 @@ function BindShortcutKeys() MoveTool.UI.IncrementOption.Increment.TextBox:CaptureFocus(); end; - -- Check if the R key was pressed down, and it wasn't Shift R - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Start tracking snap points nearest to the mouse StartSnapping(); @@ -718,7 +718,7 @@ function EnableDragging() end; -- Make sure this click was not to select - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + if Selection.Multiselecting then return; end; diff --git a/tools/NewPart.lua b/tools/NewPart.lua index 6ffa2bb..98c986b 100644 --- a/tools/NewPart.lua +++ b/tools/NewPart.lua @@ -121,11 +121,23 @@ function EnableClickCreation() return; end; + -- Enable new part dragging + DragNewParts = true; + Core.Targeting.CancelSelecting(); + -- Create the part CreatePart(NewPartTool.Type); end); + -- Listen for click releases + Connections.ClickReleaseListener = Support.AddUserInputListener('Ended', 'MouseButton1', true, function () + + -- Cancel dragging new parts if mouse button is released + DragNewParts = false; + + end); + end; function CreatePart(Type) @@ -171,7 +183,9 @@ function CreatePart(Type) Core.EquipTool(MoveTool); -- Enable dragging to allow easy positioning of the created part - MoveTool.SetUpDragging(Part); + if DragNewParts then + MoveTool.SetUpDragging(Part); + end; end; diff --git a/tools/Paint.lua b/tools/Paint.lua index 54c0b07..a032d56 100644 --- a/tools/Paint.lua +++ b/tools/Paint.lua @@ -235,8 +235,8 @@ function BindShortcutKeys() end; - -- Check if the R key was pressed - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed, and it wasn't the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Set the current color to that of the current mouse target (if any) if Core.Mouse.Target then diff --git a/tools/Resize.lua b/tools/Resize.lua index 04b876a..e29bd77 100644 --- a/tools/Resize.lua +++ b/tools/Resize.lua @@ -103,7 +103,7 @@ function ShowUI() local IncrementInput = ResizeTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) ResizeTool.Increment = tonumber(IncrementInput.Text) or ResizeTool.Increment; - IncrementInput.Text = Support.Round(ResizeTool.Increment, 3); + IncrementInput.Text = Support.Round(ResizeTool.Increment, 4); end); -- Add functionality to the size inputs @@ -292,8 +292,8 @@ function ShowHandles() Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and handle resizing is ongoing + if not HandleResizing or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -304,8 +304,7 @@ function ShowHandles() Core.Targeting.CancelSelecting(); -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -373,8 +372,7 @@ function HideHandles() Handles.Parent = nil; -- Clear unnecessary resources - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; @@ -487,8 +485,8 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByFace(Enum.NormalId.Right); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then StartSnapping(); end; @@ -513,8 +511,8 @@ function BindShortcutKeys() return; end; - -- Finish snapping when the R key is released (and it's not Shift R) - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Finish snapping when the R key is released, and it's not the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then FinishSnapping(); end; @@ -748,10 +746,13 @@ PointSnapped = Core.RbxUtility.CreateSignal(); function StartSnapping() -- Make sure snapping isn't already enabled - if SnapTracking.Enabled then + if SnappingStage or SnapTracking.Enabled then return; end; + -- Start first snapping stage + SnappingStage = 'Starting'; + -- Only enable corner snapping SnapTracking.TrackEdgeMidpoints = false; SnapTracking.TrackFaceCentroids = false; @@ -777,48 +778,89 @@ function StartSnapping() SnappingStartSelectionState = PreparePartsForResizing(); AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); + -- Pause snapping + SnapTracking.StopTracking(); + + -- Start a direction line + DirectionLine = Core.Tool.Interfaces.SnapLine:Clone(); + DirectionLine.Parent = Core.UI; + DirectionLine.Visible = false; + -- Track changes for history TrackChange(); -- Listen for when the user drags - Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', false, function (Input) + Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', true, function (Input) -- Update the latest aim SnappingEndAim = Vector2.new(Input.Position.X, Input.Position.Y); + ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); + ScreenSnappedPoint = Vector2.new(ScreenSnappedPoint.X, ScreenSnappedPoint.Y); - -- Use the mouse position to figure out the resize direction (until after 20px) - if SnappingStage == 'Direction' then + -- Calculate direction setting length + local DirectionSettingLength = math.min(50, math.max(50, (SnappingStartAim - ScreenSnappedPoint).magnitude * 1.5)); - -- Check the length - local Length = (SnappingEndAim - SnappingStartAim).magnitude; - if Length < 20 then - return; - end; + -- Use the mouse position to figure out the resize direction (until after direction setting length) + if SnappingStage == 'Direction' then - local DragSlope = (SnappingEndAim.Y - SnappingStartAim.Y) / (SnappingEndAim.X - SnappingStartAim.X); + -- Get current angle from snap point + local DragAngle = math.deg(math.atan2(SnappingEndAim.Y - ScreenSnappedPoint.Y, SnappingEndAim.X - ScreenSnappedPoint.X)); + DragAngle = (DragAngle > 0) and (DragAngle - 360) or DragAngle; -- Go through corner offsets representing the possible directions local Directions = {}; for _, Direction in pairs(SnappingStartDirections) do -- Map the corner & corner offset to screen points - local ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); local ScreenOffsetPoint = Workspace.CurrentCamera:WorldToScreenPoint(Direction.Offset); - -- Get the slope representing the direction (based on the mapped screen points) - local DirectionSlope = (ScreenOffsetPoint.Y - ScreenSnappedPoint.Y) / (ScreenOffsetPoint.X - ScreenSnappedPoint.X); + -- Get direction angle from snap point + local DirectionAngle = math.deg(math.atan2(ScreenOffsetPoint.Y - ScreenSnappedPoint.Y, ScreenOffsetPoint.X - ScreenSnappedPoint.X)); + DirectionAngle = (DirectionAngle > 0) and (DirectionAngle - 360) or DirectionAngle; + + -- Calculate delta between drag and direction angles + local AngleDelta = math.abs(DragAngle - DirectionAngle) % 180; + AngleDelta = (AngleDelta > 90) and (180 - AngleDelta) or AngleDelta; - -- Calculate the similarity between the drag & direction slopes - local SlopeDelta = math.abs(math.abs(DragSlope) - math.abs(DirectionSlope)); - table.insert(Directions, { Face = Direction.Face, SlopeDelta = SlopeDelta, Offset = Direction.Offset }); + -- Insert the potential direction + table.insert(Directions, { + Face = Direction.Face, + AngleDelta = AngleDelta, + DirectionAngle = DirectionAngle, + Offset = Direction.Offset + }); end; - -- Get the direction slope closest to the mouse's + -- Get the direction most similar to the dragging angle table.sort(Directions, function (A, B) - return A.SlopeDelta < B.SlopeDelta; + return A.AngleDelta < B.AngleDelta; end); + -- Center direction line at snap point + DirectionLine.Position = UDim2.new(0, ScreenSnappedPoint.X, 0, ScreenSnappedPoint.Y); + + -- Orient direction line towards drag direction + if math.abs(DragAngle - Directions[1].DirectionAngle) <= 90 then + DirectionLine.Rotation = Directions[1].DirectionAngle; + else + DirectionLine.Rotation = 180 + Directions[1].DirectionAngle; + end; + + -- Show the direction line + DirectionLine.PointMarker.Rotation = -DirectionLine.Rotation; + DirectionLine.SnapProgress.Size = UDim2.new(0, DirectionSettingLength, 2, 0); + DirectionLine.Visible = true; + + -- Check if drag has passed direction setting length + local Length = (SnappingEndAim - ScreenSnappedPoint).magnitude; + if Length < DirectionSettingLength then + return; + end; + + -- Clear the direction line + DirectionLine:Destroy() + -- Select the resizing direction that was closest to the mouse drag SnappingDirection = Directions[1].Face; SnappingDirectionOffset = Directions[1].Offset; @@ -826,11 +868,24 @@ function StartSnapping() -- Move to the destination-picking stage of snapping SnappingStage = 'Destination'; + -- Set destination-stage snapping options + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackFaceCentroids = true; SnapTracking.TargetFilter = function (Target) return not Target.Locked; end; SnapTracking.TargetBlacklist = Selection.Items; - -- Resize in the selected direction up to the targeted destination - elseif SnappingStage == 'Destination' then + -- Re-enable snapping to select destination + SnapTracking.StartTracking(function (NewPoint) + if NewPoint and NewPoint.p ~= SnappedPoint then + SnappedPoint = NewPoint.p; + PointSnapped:fire(NewPoint.p); + end; + end); + + -- Start a distance alignment line + AlignmentLine = Core.Tool.Interfaces.SnapLineSegment:Clone(); + AlignmentLine.Visible = false; + AlignmentLine.Parent = Core.UI; end; @@ -839,7 +894,10 @@ function StartSnapping() -- Listen for when a new point is snapped Connections.Snap = PointSnapped:connect(function (SnappedPoint) + -- Resize to snap point if in the destination stage of snapping if SnappingStage == 'Destination' then + + -- Calculate direction and distance to resize towards local Direction = (SnappingDirectionOffset - SnappingStartPoint).unit; local Distance = (SnappedPoint - SnappingStartPoint):Dot(Direction); @@ -859,24 +917,41 @@ function StartSnapping() end; end; + -- Get snap point and destination point screen positions for UI alignment + local ScreenStartPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint + (Direction * Distance)); + ScreenStartPoint = Vector2.new(ScreenStartPoint.X, ScreenStartPoint.Y); + local ScreenDestinationPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappedPoint); + ScreenDestinationPoint = Vector2.new(ScreenDestinationPoint.X, ScreenDestinationPoint.Y) + + -- Update the distance alignment line + local AlignmentAngle = math.deg(math.atan2(ScreenDestinationPoint.Y - ScreenStartPoint.Y, ScreenDestinationPoint.X - ScreenStartPoint.X)); + local AlignmentCenter = ScreenStartPoint:Lerp(ScreenDestinationPoint, 0.5); + AlignmentLine.Position = UDim2.new(0, AlignmentCenter.X, 0, AlignmentCenter.Y); + AlignmentLine.Rotation = AlignmentAngle; + AlignmentLine.Size = UDim2.new(0, (ScreenDestinationPoint - ScreenStartPoint).magnitude, 0, 1); + AlignmentLine.PointMarkerA.Rotation = -AlignmentAngle; + AlignmentLine.Visible = true; + end; end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', false, function (Input) + end); + + -- Listen for the end of the snapping + Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) - -- Restore the selection's original state + -- If destination stage was reached, restore the selection's original state + if SnappingStage == 'Destination' then for Part, PartState in pairs(SnappingStartSelectionState) do Part:MakeJoints(); Part.CanCollide = PartState.CanCollide; Part.Anchored = PartState.Anchored; end; + end; - -- Finish snapping - FinishSnapping(); - - end); + -- Finish snapping + FinishSnapping(); end); @@ -884,14 +959,27 @@ end; function FinishSnapping() - -- Make sure snapping is enabled - if not SnapTracking.Enabled then + -- Ensure snapping is ongoing + if not SnappingStage then return; end; + -- Disable any snapping stage + SnappingStage = nil; + -- Stop snap point tracking SnapTracking.StopTracking(); + -- Clear any UI + if DirectionLine then + DirectionLine:Destroy(); + DirectionLine = nil; + end; + if AlignmentLine then + AlignmentLine:Destroy(); + AlignmentLine = nil; + end; + -- Register any change if HistoryRecord then RegisterChange(); @@ -916,7 +1004,8 @@ function GetFaceOffsetsFromCorner(Part, Point) for _, Face in pairs(Faces) do -- Calculate the offset from the corner in the direction of the face - local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * Vector3.FromNormalId(Face); + local FaceOffset = (Vector3.FromNormalId(Face) * Part.Size) / 2; + local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * FaceOffset; table.insert(Offsets, { Face = Face, Offset = Offset }); end; diff --git a/tools/Rotate.lua b/tools/Rotate.lua index 800cb4f..f58b0e8 100644 --- a/tools/Rotate.lua +++ b/tools/Rotate.lua @@ -110,7 +110,7 @@ function ShowUI() local IncrementInput = RotateTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) RotateTool.Increment = tonumber(IncrementInput.Text) or RotateTool.Increment; - IncrementInput.Text = Support.Round(RotateTool.Increment, 3); + IncrementInput.Text = Support.Round(RotateTool.Increment, 4); end); -- Add functionality to the rotation inputs @@ -250,8 +250,7 @@ function AttachHandles(Part, Autofocus) -- Disable autofocus if not requested and on elseif not Autofocus and Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; -- Just attach and show the handles if they already exist @@ -312,8 +311,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and rotating is ongoing + if not HandleRotating or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -324,8 +323,7 @@ function AttachHandles(Part, Autofocus) HandleRotating = false; -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -390,10 +388,7 @@ function HideHandles() Handles.Parent = nil; -- Disable handle autofocus if enabled - if Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; - end; + ClearConnection 'AutofocusHandle'; end; @@ -495,8 +490,12 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByAxis(Enum.Axis.Y, 1); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif (InputInfo.KeyCode == Enum.KeyCode.R) and not Selection.Multiselecting then + StartSnapping(); + + -- Start snapping when T key is pressed down (alias) + elseif InputInfo.KeyCode == Enum.KeyCode.T then StartSnapping(); end;