if not plugin or game:GetService("RunService"):IsRunning() then return end
-- QuickBuild
local QuickBuild = script.Parent
-- Modules Folders
local ObjectModules = script:FindFirstChild("Object") -- Line giving an error
local ObjectPositioningModules = ObjectModules.Positioning
local UIModules = script.UI
-- Modules
-- ObjectPositioning
local PreviewPositionObjectModule = require(ObjectPositioningModules.PreviewPositionObject)
local PositionObjectModule = require(ObjectPositioningModules.PositionObject)
-- UI
local UIClickDetectionModule = require(UIModules.UIClickDetection)
local MainPluginUiModule = require(UIModules.MainPluginUI)
-- Colors
local ColorsModule = require(script.Colors)
-- Services
local ChangeHistoryService = game:GetService("ChangeHistoryService")
local Selection = game:GetService("Selection")
-- Create a new toolbar section titled "Custom Script Tools"
local toolbar = plugin:CreateToolbar("Quick Build")
-- Add a toolbar button named "Create Empty Script"
local quickBuildButton = toolbar:CreateButton("Open QuickBuild UI", "Open the QuickBuild UI", "rbxassetid://4458901886")
-- Make button clickable even if 3D viewport is hidden
quickBuildButton.ClickableWhenViewportHidden = false
-- Tables
-- sidesSelected values will be either
-- positive or negative or nil
local sidesSelected = {
XAxis = "Nil",
YAxis = "Nil",
ZAxis = "Nil"
}
local newSelection = {}
-- Debounces
local Opened = false
-- Create new "DockWidgetPluginGuiInfo" object
local quickBuildWidgetInfo = DockWidgetPluginGuiInfo.new(
Enum.InitialDockState.Right, -- Window will be initialized in a floating state.
true, -- Window will be initially enabled.
false, -- Don't override the saved enabled/dock state.
300, -- Width of the floating window.
350, -- Height of the floating window.
300, -- Minimum Width
150
)
MainPluginUiModule:createMainPluginUI(quickBuildWidgetInfo, "Quick Build")
local QuickBuildWidget = MainPluginUiModule:GetMainPluginUI()
local QuickBuildMainGui = QuickBuild.QuickBuildMainGui
QuickBuildMainGui.Parent = QuickBuildWidget
local QuickBuildMainGuiButton = QuickBuildMainGui.QuickBuild.QuickBuildButton
local QuickBuildMainGuiPositioning = QuickBuildMainGui.QuickBuildMainGuiPositioning.Positioning
local QuickBuildMainGuiXPosition = QuickBuildMainGuiPositioning.XPosition
local QuickBuildMainGuiXPositionContainer = QuickBuildMainGuiXPosition.Container
local quickBuildMainGuiClonePositiveButtonX = QuickBuildMainGuiXPositionContainer.ClonePositiveX
local quickBuildMainGuiCloneNegativeButtonX = QuickBuildMainGuiXPositionContainer.CloneNegativeX
local QuickBuildMainGuiYPosition = QuickBuildMainGuiPositioning.YPosition
local QuickBuildMainGuiYPositionContainer = QuickBuildMainGuiYPosition.Container
local quickBuildMainGuiClonePositiveButtonY = QuickBuildMainGuiYPositionContainer.ClonePositiveY
local quickBuildMainGuiCloneNegativeButtonY = QuickBuildMainGuiYPositionContainer.CloneNegativeY
local QuickBuildMainGuiZPosition = QuickBuildMainGuiPositioning.ZPosition
local QuickBuildMainGuiZPositionContainer = QuickBuildMainGuiZPosition.Container
local quickBuildMainGuiClonePositiveButtonZ = QuickBuildMainGuiZPositionContainer.ClonePositiveZ
local quickBuildMainGuiCloneNegativeButtonZ = QuickBuildMainGuiZPositionContainer.CloneNegativeZ
-- Open/Close GUI
quickBuildButton.Click:Connect(function()
if Opened then
QuickBuildWidget.Enabled = false
Opened = false
else
QuickBuildWidget.Enabled = true
Opened = true
end
end)
local function onPositionPreviewButtonClicked()
local selectedObject = Selection:Get()
if #selectedObject == 1 and selectedObject[1] ~= nil and selectedObject[1]:IsA("Part") then
local objectToPreview = selectedObject[1]
-- Remove preview object if there is one
local previewObject = PreviewPositionObjectModule:getPreviewObject()
if previewObject then
previewObject:Destroy()
end
PreviewPositionObjectModule:PreviewObject(objectToPreview, sidesSelected)
end
end
local function cancelPositionPreview()
local previewBlinkObject = PreviewPositionObjectModule:getPreviewObject()
if previewBlinkObject == nil then
return
end
previewBlinkObject:Destroy()
end
local function onPositionButtonClicked(axis, side, button, selectionColor)
if button == nil then
warn("Error, please restart studio!")
return
end
if button:FindFirstChild("Selected") and button:FindFirstChild("Selected").Value == false then
local selectedObject = Selection:Get()
local previewBlinkObject = PreviewPositionObjectModule:getPreviewObject()
if previewBlinkObject ~= nil then
previewBlinkObject:Destroy()
end
if selectedObject and #selectedObject == 1 and selectedObject[1] ~= nil and selectedObject[1]:IsA("Part") then
for _, positionButton in ipairs(button.Parent:GetChildren()) do
if positionButton:IsA("TextButton") and positionButton ~= button then
positionButton.BackgroundColor3 = Color3.fromHex(ColorsModule.colors["ButtonUnselectedColor"])
positionButton:FindFirstChild("Selected").Value = false
end
end
sidesSelected[axis.."Axis"] = side
PreviewPositionObjectModule:PreviewObject(selectedObject[1], sidesSelected)
button.BackgroundColor3 = Color3.fromHex(selectionColor)
button:FindFirstChild("Selected").Value = true
elseif #selectedObject > 1 then
warn("Cannot select more than one object")
elseif #selectedObject < 1 then
warn("Select at least one object")
end
elseif button:FindFirstChild("Selected") and button:FindFirstChild("Selected").Value == true then
local selectedObject = Selection:Get()
local previewBlinkObject = PreviewPositionObjectModule:getPreviewObject()
if previewBlinkObject ~= nil then
previewBlinkObject:Destroy()
end
if button == nil then
warn("Error, please restart studio!")
return
end
if selectedObject and #selectedObject == 1 and selectedObject[1] ~= nil and selectedObject[1]:IsA("Part") then
sidesSelected[axis.."Axis"] = "Nil"
if sidesSelected["XAxis"] == "Nil" and sidesSelected["YAxis"] == "Nil" and sidesSelected["ZAxis"] == "Nil" then
local deleteBlinkObject = PreviewPositionObjectModule:getPreviewObject()
if deleteBlinkObject ~= nil then
deleteBlinkObject:Destroy()
button.BackgroundColor3 = Color3.fromHex(ColorsModule.colors["ButtonUnselectedColor"])
button:FindFirstChild("Selected").Value = false
return
end
end
PreviewPositionObjectModule:PreviewObject(selectedObject[1], sidesSelected)
button.BackgroundColor3 = Color3.fromHex(ColorsModule.colors["ButtonUnselectedColor"])
button:FindFirstChild("Selected").Value = false
elseif #selectedObject > 1 then
warn("Cannot select more than one object")
elseif #selectedObject < 1 then
warn("Select at least one object")
end
end
end
local function onQuickBuildButtonClicked()
local selectedObject = Selection:Get()
if sidesSelected["XAxis"] == "Nil" and sidesSelected["YAxis"] == "Nil" and sidesSelected["ZAxis"] == "Nil" then
warn("Select a side to build first")
return
end
if #selectedObject == 1 then
if selectedObject and #selectedObject == 1 and selectedObject[1] ~= nil and selectedObject[1]:IsA("Part") then
local previewBlinkObject = PreviewPositionObjectModule:getPreviewObject()
if previewBlinkObject == nil then
return
end
previewBlinkObject:Destroy()
local objectToClone = selectedObject[1]:Clone()
PositionObjectModule:PositionObject(sidesSelected, objectToClone)
-- Set selection to object cloned for efficiency
table.insert(newSelection, objectToClone)
Selection:Set(newSelection)
-- Remove from table so multiple objects don't get selected
table.remove(newSelection, 1)
ChangeHistoryService:SetWaypoint("Positioned the selected object")
PreviewPositionObjectModule:PreviewObject(objectToClone, sidesSelected)
end
elseif #selectedObject > 1 then
warn("Cannot select more than one object")
elseif #selectedObject < 1 then
warn("Select at least one object")
end
end
-- Buttons Action Connections
QuickBuildMainGuiButton.MouseButton1Click:Connect(function()
onQuickBuildButtonClicked()
end)
-- X Position Buttons
quickBuildMainGuiClonePositiveButtonX.MouseButton1Click:Connect(function()
onPositionButtonClicked("X", "Positive", quickBuildMainGuiClonePositiveButtonX, ColorsModule.colors["ButtonSelectedColor"])
end)
quickBuildMainGuiCloneNegativeButtonX.MouseButton1Click:Connect(function()
onPositionButtonClicked("X", "Negative", quickBuildMainGuiCloneNegativeButtonX, ColorsModule.colors["ButtonSelectedColor"])
end)
-- Y Position Buttons
quickBuildMainGuiClonePositiveButtonY.MouseButton1Click:Connect(function()
onPositionButtonClicked("Y", "Positive", quickBuildMainGuiClonePositiveButtonY, ColorsModule.colors["ButtonSelectedColor"])
end)
quickBuildMainGuiCloneNegativeButtonY.MouseButton1Click:Connect(function()
onPositionButtonClicked("Y", "Negative", quickBuildMainGuiCloneNegativeButtonY, ColorsModule.colors["ButtonSelectedColor"])
end)
-- Z Position Buttons
quickBuildMainGuiClonePositiveButtonZ.MouseButton1Click:Connect(function()
onPositionButtonClicked("Z", "Positive", quickBuildMainGuiClonePositiveButtonZ, ColorsModule.colors["ButtonSelectedColor"])
end)
quickBuildMainGuiCloneNegativeButtonZ.MouseButton1Click:Connect(function()
onPositionButtonClicked("Z", "Negative", quickBuildMainGuiCloneNegativeButtonZ, ColorsModule.colors["ButtonSelectedColor"])
end)