local o={}function NewPartTool.Equip()ShowUI()EnableClickCreation()SetType(NewPartTool.Type)end function NewPartTool.Unequip()HideUI()ClearConnections()ContextActionService:UnbindAction("\066\084\058 \067\114\101\097\116\101 \112\097\114\116")end function ClearConnections()for a,x in pairs(o)do x:Disconnect()o[a]=nil end end function ShowUI()if UI then UI.Visible=true return end UI=Core.Tool.Interfaces.BTNewPartToolGUI:Clone()UI.Parent=Core.UI UI.Visible=true Types={"\078\111\114\109\097\108","\084\114\117\115\115";"\087\101\100\103\101";"\067\111\114\110\101\114";"\067\121\108\105\110\100\101\114";"\066\097\108\108","\083\101\097\116";"\086\101\104\105\099\108\101 \083\101\097\116","\083\112\097\119\110"}TypeDropdown=(Core.Cheer(UI.TypeOption.Dropdown)).Start(Types,"",function(o)SetType(o)end)end function HideUI()if not UI then return end UI.Visible=false end function SetType(o)NewPartTool.Type=o TypeDropdown.SetOption(o)end function EnableClickCreation()local function o(o,a,x)if a.Name=="\066\101\103\105\110"then DragNewParts=true Core.Targeting.CancelSelecting()CreatePart(NewPartTool.Type)elseif a.Name=="\069\110\100"then DragNewParts=nil end end ContextActionService:BindAction("\066\084\058 \067\114\101\097\116\101 \112\097\114\116",o,false,Enum.UserInputType.MouseButton1,Enum.UserInputType.Touch)end function CreatePart(o)local a=Core.SyncAPI:Invoke("\067\114\101\097\116\101\080\097\114\116",o,CFrame.new(Core.Mouse.Hit.p),Core.Targeting.Scope)if not a then return end local x={Part=a;Unapply=function(o)Core.SyncAPI:Invoke("\082\101\109\111\118\101",{o.Part})end;Apply=function(o)Core.SyncAPI:Invoke("\085\110\100\111\082\101\109\111\118\101",{o.Part})end}Core.History.Add(x)Selection.Replace({a})local r=require(Core.Tool.Tools.Move)Core.EquipTool(r)if DragNewParts then r.FreeDragging:SetUpDragging(a)end end

local Connections = {};

function NewPartTool.Equip()
	-- Enables the tool's equipped functionality

	-- Start up our interface
	ShowUI();
	EnableClickCreation();

	-- Set our current type
	SetType(NewPartTool.Type);

end;

function NewPartTool.Unequip()
	-- Disables the tool's equipped functionality

	-- Clear unnecessary resources
	HideUI();
	ClearConnections();
	ContextActionService:UnbindAction('BT: Create part')

end;

function ClearConnections()
	-- Clears out temporary connections

	for ConnectionKey, Connection in pairs(Connections) do
		Connection:Disconnect();
		Connections[ConnectionKey] = nil;
	end;

end;

function ShowUI()
	-- Creates and reveals the UI

	-- Reveal UI if already created
	if UI then

		-- Reveal the UI
		UI.Visible = true;

		-- Skip UI creation
		return;

	end;

	-- Create the UI
	UI = Core.Tool.Interfaces.BTNewPartToolGUI:Clone();
	UI.Parent = Core.UI;
	UI.Visible = true;

	-- Creatable part types
	Types = { 'Normal', 'Truss', 'Wedge', 'Corner', 'Cylinder', 'Ball', 'Seat', 'Vehicle Seat', 'Spawn' };

	-- Create the type selection dropdown
	TypeDropdown = Core.Cheer(UI.TypeOption.Dropdown).Start(Types, '', function (Type)
		SetType(Type);
	end);

end;

function HideUI()
	-- Hides the tool UI

	-- Make sure there's a UI
	if not UI then
		return;
	end;

	-- Hide the UI
	UI.Visible = false;

end;

function SetType(Type)

	-- Update the tool option
	NewPartTool.Type = Type;

	-- Update the UI
	TypeDropdown.SetOption(Type);

end;

function EnableClickCreation()
	-- Allows the user to click anywhere and create a new part

	local function CreateAtTarget(Action, State, Input)

		-- Drag new parts
		if State.Name == 'Begin' then
			DragNewParts = true
			Core.Targeting.CancelSelecting()

			-- Create new part
			CreatePart(NewPartTool.Type)

		-- Disable dragging on release
		elseif State.Name == 'End' then
			DragNewParts = nil
		end

	end

	-- Register input handler
	ContextActionService:BindAction('BT: Create part', CreateAtTarget, false,
		Enum.UserInputType.MouseButton1,
		Enum.UserInputType.Touch
	)

end;

function CreatePart(Type)

	-- Send the creation request to the server
	local Part = Core.SyncAPI:Invoke('CreatePart', Type, CFrame.new(Core.Mouse.Hit.p), Core.Targeting.Scope)

	-- Make sure the part creation succeeds
	if not Part then
		return;
	end;

	-- Put together the history record
	local HistoryRecord = {
		Part = Part;

		Unapply = function (HistoryRecord)
			-- Reverts this change

			-- Remove the part
			Core.SyncAPI:Invoke('Remove', { HistoryRecord.Part });

		end;

		Apply = function (HistoryRecord)
			-- Reapplies this change

			-- Restore the part
			Core.SyncAPI:Invoke('UndoRemove', { HistoryRecord.Part });

		end;

	};

	-- Register the history record
	Core.History.Add(HistoryRecord);

	-- Select the part
	Selection.Replace({ Part });

	-- Switch to the move tool
	local MoveTool = require(Core.Tool.Tools.Move);
	Core.EquipTool(MoveTool);

	-- Enable dragging to allow easy positioning of the created part
	if DragNewParts then
		MoveTool.FreeDragging:SetUpDragging(Part)
	end;

end;
