while game == nil do wait(1 / 30) end --------------- --PLUGIN SETUP- --------------- local loaded = false local on = false local On, Off local this = PluginManager():CreatePlugin() this.Deactivation:connect(function() Off() end) local toolbar = this:CreateToolbar "Terrain" local toolbarbutton = toolbar:CreateButton( "Stamper", "Part Stamper - Toggle List (Shift + F)", "stamp.png" ) toolbarbutton.Click:connect(function() if on then Off() elseif loaded then On() end end) game:WaitForChild "Workspace" game.Workspace:WaitForChild "Terrain" ----------------- --DEFAULT VALUES- ----------------- local currStampGui local currStampId local recentsFrame local waterTypeChangedEvent local waterForceAndDirection = { "None", "NegX" } local setPanelVisibility local getPanelVisibility local stampControl local lastStampModel local keyCon -- ids of users we want to load sets in from local userSetIds = { 11744447, 18881789, 18881808, 18881829, 18881853, 18881866 } local recentButtonStack = {} -- mouse management local mouse -- Libraries local RbxStamper local RbxGui Spawn(function() RbxGui = LoadLibrary "RbxGui" RbxStamper = LoadLibrary "RbxStamper" end) local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() ----------------------- --FUNCTION DEFINITIONS- ----------------------- function getRbxGui() if not RbxGui then print "teh new rbxgui" RbxGui = LoadLibrary "RbxGui" end return RbxGui end function getRbxStamper() if not RbxStamper then print "teh new stamper" RbxStamper = LoadLibrary "RbxStamper" end return RbxStamper end function showLoadingDialog() currStampGui.LoadingFrame.LoadingText:TweenPosition( UDim2.new(0, 150, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 2, true ) currStampGui.LoadingFrame.Visible = true end function hideLoadingDialog() currStampGui.LoadingFrame.LoadingText:TweenPosition( UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.1, true ) currStampGui.LoadingFrame.Visible = false end local partSelected = function(name, id, terrainShape) if not id then return end if not name then return end currStampId = id if stampControl then stampControl.Destroy() end if stampCon then stampCon:disconnect() stampCon = nil end setPanelVisibility(false) showLoadingDialog() lastStampModel = getRbxStamper().GetStampModel(id, terrainShape) updateRecentParts(name, id, terrainShape) hideLoadingDialog() if lastStampModel.Name == "MegaClusterCube" then local clusterTag = lastStampModel:FindFirstChild "ClusterMaterial" -- we are going to stamp water, send info to stamper about this if clusterTag and clusterTag:isA "Vector3Value" and clusterTag.Value.X == 17 then local waterForceTag = Instance.new("StringValue", lastStampModel) waterForceTag.Name = "WaterForceTag" waterForceTag.Value = waterForceAndDirection[1] local waterForceDirectionTag = Instance.new("StringValue", lastStampModel) waterForceDirectionTag.Name = "WaterForceDirectionTag" waterForceDirectionTag.Value = waterForceAndDirection[2] end end setupStamper(lastStampModel, mouse) end function updateWaterInfo() if stampControl then stampControl.Destroy() end if stampCon then stampCon:disconnect() stampCon = nil end showLoadingDialog() lastStampModel = getRbxStamper().GetStampModel(currStampId) hideLoadingDialog() if lastStampModel.Name == "MegaClusterCube" then local clusterTag = lastStampModel:FindFirstChild "ClusterMaterial" -- we are going to stamp water, send info to stamper about this if clusterTag and clusterTag.Value.X == 17 then local waterForceTag = Instance.new("StringValue", lastStampModel) waterForceTag.Name = "WaterForceTag" waterForceTag.Value = waterForceAndDirection[1] local waterForceDirectionTag = Instance.new("StringValue", lastStampModel) waterForceDirectionTag.Name = "WaterForceDirectionTag" waterForceDirectionTag.Value = waterForceAndDirection[2] end end setupStamper(lastStampModel, mouse) end local dialogClosed = function() if lastStampModel then if stampControl then stampControl.Destroy() end setupStamper(lastStampModel, mouse) end end function pickPart() if stampControl then stampControl.Destroy() end setPanelVisibility(true) end function keyHandler(key) if key == "f" then handlePartShow() end end function partOn() pickPart() end function partOff() setPanelVisibility(false) if lastStampModel then if stampControl then stampControl.Destroy() end setupStamper(lastStampModel, mouse) end end function handlePartShow() if getPanelVisibility() then partOff() else partOn() end end On = function() if not game.Workspace.Terrain then return end if this then this:Activate(true) mouse = this:GetMouse() end if toolbarbutton then toolbarbutton:SetActive(true) end if not currStampGui then -- first load, lets make the gui createGui() end if setPanelVisibility then setPanelVisibility(true) end if recentsFrame then recentsFrame.Visible = true end if keyHandler then keyCon = mouse.KeyDown:connect(keyHandler) end on = true end Off = function() if toolbarbutton then toolbarbutton:SetActive(false) end if stampControl then stampControl.Destroy() end if keyCon then keyCon:disconnect() keyCon = nil end if currStampGui and currStampGui:FindFirstChild "WaterFrame" then currStampGui.WaterFrame.Visible = false end if lastStampModel then lastStampModel:Destroy() end if setPanelVisibility then setPanelVisibility(false) end if recentsFrame then recentsFrame.Visible = false end on = false end function setupStamper(model, mouse) if model then stampControl = getRbxStamper().SetupStamperDragger(model, mouse) if stampControl then stampCon = stampControl.Stamped.Changed:connect(function() if stampControl.Stamped.Value then stampControl.ReloadModel() end end) end end end function updateRecentParts(newName, newId, newTerrainShape) if newId then for i = 1, #recentButtonStack do if recentButtonStack[i].Id == newId then -- already have item, nothing to do return end end for i = #recentButtonStack - 1, 1, -1 do recentButtonStack[i + 1].Id = recentButtonStack[i].Id recentButtonStack[i + 1].Name = recentButtonStack[i].Name recentButtonStack[i + 1].TerrainShape = recentButtonStack[i].TerrainShape recentButtonStack[i + 1].Button.Image = recentButtonStack[i].Button.Image end recentButtonStack[1].Id = newId recentButtonStack[1].Name = newName recentButtonStack[1].TerrainShape = newTerrainShape recentButtonStack[1].Button.Image = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" .. tostring(newId) end end ------ --GUI- ------ function createGui() --Insert Panel currStampGui, setPanelVisibility, getPanelVisibility, waterTypeChangedEvent = getRbxGui().CreateSetPanel( userSetIds, partSelected, dialogClosed, UDim2.new(0.8, 0, 0.9, 0), UDim2.new(0.1, 0, 0.05, 0), true ) setPanelVisibility(false) currStampGui.Parent = game:GetService "CoreGui" waterTypeChangedEvent.Event:connect(function(waterTable) waterForceAndDirection = waterTable updateWaterInfo() end) -- Loading Gui local loadingFrame = Instance.new "Frame" loadingFrame.Name = "LoadingFrame" loadingFrame.Style = Enum.FrameStyle.RobloxRound loadingFrame.Size = UDim2.new(0, 350, 0, 60) loadingFrame.Visible = false loadingFrame.Position = UDim2.new(0.5, -175, 0.5, -30) local loadingText = Instance.new "TextLabel" loadingText.Name = "LoadingText" loadingText.BackgroundTransparency = 1 loadingText.Size = UDim2.new(0, 155, 1, 0) loadingText.Font = Enum.Font.ArialBold loadingText.FontSize = Enum.FontSize.Size36 loadingText.Text = "Loading..." loadingText.TextColor3 = Color3.new(1, 1, 1) loadingText.TextStrokeTransparency = 0 loadingText.Parent = loadingFrame loadingFrame.Parent = currStampGui -- Recents Stack Gui recentsFrame = Instance.new "Frame" recentsFrame.BackgroundTransparency = 0.5 recentsFrame.Name = "RecentsFrame" recentsFrame.BackgroundColor3 = Color3.new(0, 0, 0) recentsFrame.Size = UDim2.new(0, 50, 0, 150) recentsFrame.Visible = false recentsFrame.Parent = currStampGui local recentButtonOne = Instance.new "ImageButton" recentButtonOne.Style = Enum.ButtonStyle.RobloxButton recentButtonOne.Name = "RecentButtonOne" recentButtonOne.Size = UDim2.new(0, 50, 0, 50) recentButtonOne.Parent = recentsFrame local recentButtonTwo = recentButtonOne:clone() recentButtonTwo.Name = "RecentButtonTwo" recentButtonTwo.Position = UDim2.new(0, 0, 0, 50) recentButtonTwo.Parent = recentsFrame local recentButtonThree = recentButtonOne:clone() recentButtonThree.Name = "RecentButtonThree" recentButtonThree.Position = UDim2.new(0, 0, 0, 100) recentButtonThree.Parent = recentsFrame for i = 1, 3 do recentButtonStack[i] = {} recentButtonStack[i].Name = nil recentButtonStack[i].Id = nil recentButtonStack[i].TerrainShape = nil end recentButtonStack[1].Button = recentButtonOne recentButtonStack[2].Button = recentButtonTwo recentButtonStack[3].Button = recentButtonThree local buttonClicked = false for i = 1, #recentButtonStack do recentButtonStack[i].Button.MouseButton1Click:connect(function() if buttonClicked then return end buttonClicked = true partSelected( recentButtonStack[i].Name, recentButtonStack[i].Id, recentButtonStack[i].TerrainShape ) buttonClicked = false end) end end -------------------------- --SUCCESSFUL LOAD MESSAGE- -------------------------- loaded = true