From 736186bb75f384f0d14c1e1e1abad2e9747e4f0d Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Sun, 16 Apr 2023 08:51:28 +0100 Subject: [PATCH] Rewrite more corescripts in yuescript --- yue/45284430.lua | 2370 +++++++++++++++++- yue/45284430.yue | 6092 ++++++++++++++++------------------------------ yue/48488398.lua | 234 ++ yue/48488398.yue | 294 +++ 4 files changed, 5006 insertions(+), 3984 deletions(-) create mode 100644 yue/48488398.lua diff --git a/yue/45284430.lua b/yue/45284430.lua index a71760b..f5fde8c 100644 --- a/yue/45284430.lua +++ b/yue/45284430.lua @@ -32,15 +32,16 @@ ScopedConnect = function(parentInstance, instance, event, signalFunc, syncFunc, if game:IsAncestorOf(parentInstance) then if not eventConnection then eventConnection = instance[event]:connect(signalFunc) - if syncFunc then + if syncFunc ~= nil then syncFunc() end end if eventConnection then eventConnection:disconnect() - if removeFunc then + if removeFunc ~= nil then return removeFunc() end + return nil end end end @@ -119,9 +120,11 @@ end local cancelSlide cancelSlide = function(areaSoak) areaSoak.Visible = false - if areaSoakMouseMoveCon then - return areaSoakMouseMoveCon:disconnect() + local _obj_0 = areaSoakMouseMoveCon + if _obj_0 ~= nil then + return _obj_0:disconnect() end + return nil end t.CreateStyledMessageDialog = function(title, message, style, buttons) local frame = New("Frame", "MessageDialog", { @@ -212,9 +215,26 @@ end t.CreateDropDownMenu = function(items, onSelect, forRoblox) local width = UDim.new(0, 100) local height = UDim.new(0, 32) + local itemCount = #items + local dropDownItemCount = itemCount + local useScrollButtons = false + if dropDownItemCount > 6 then + useScrollButtons = true + dropDownItemCount = 6 + end local frame = New("Frame", "DropDownMenu", { BackgroundTransparency = 1, Size = UDim2.new(width, height), + New("TextButton", "List", { + Text = "", + BackgroundTransparency = 1, + Style = Enum.ButtonStyle.RobloxButton, + Visible = false, + Active = true, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, (1 + dropDownItemCount) * 0.8, 0), + ZIndex = 2 + }), New("TextButton", "DropDownMenuButton", { TextWrap = true, TextColor3 = Color3.new(1, 1, 1), @@ -238,25 +258,7 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) }) }) }) - local dropDownMenu = frame.DropDownMenuButton - local itemCount = #items - local dropDownItemCount = #items - local useScrollButtons = false - if dropDownItemCount > 6 then - useScrollButtons = true - dropDownItemCount = 6 - end - local droppedDownMenu = New("TextButton", "List", { - Text = "", - BackgroundTransparency = 1, - Style = Enum.ButtonStyle.RobloxButton, - Visible = false, - Active = true, - Position = UDim2.new(0, 0, 0, 0), - Size = UDim2.new(1, 0, (1 + dropDownItemCount) * 0.8, 0), - Parent = frame, - ZIndex = 2 - }) + local dropDownMenu, droppedDownMenu = frame.DropDownMenuButton, frame.List local choiceButton = New("TextButton", "ChoiceButton", { BackgroundTransparency = 1, BorderSizePixel = 0, @@ -267,13 +269,13 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) BackgroundColor3 = Color3.new(1, 1, 1), Font = Enum.Font.Arial, FontSize = Enum.FontSize.Size18, - Size = (function() + Size = UDim2.new((function() if useScrollButtons then - return UDim2.new(1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) + return 1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 else - return UDim2.new(1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) + return 1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 end - end)(), + end)()), TextWrap = true, ZIndex = 2 }) @@ -286,8 +288,7 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) ZIndex = 3 }) local dropDownSelected = false - local scrollUpButton - local scrollDownButton + local scrollUpButton, scrollDownButton local scrollMouseCount = 0 local setZIndex setZIndex = function(baseZIndex) @@ -501,8 +502,7 @@ t.CreatePropertyDropDownMenu = function(instance, property, enum) names[i] = obj.Name nameToItem[obj.Name] = obj end - local frame, updateSelection - frame, updateSelection = t.CreateDropDownMenu(names, function(text) + local frame, updateSelection = t.CreateDropDownMenu(names, function(text) instance[property] = nameToItem[text] end) local t1 @@ -577,7 +577,7 @@ end local layoutGuiObjectsHelper layoutGuiObjectsHelper = function(frame, guiObjects, settingsTable) local totalPixels = frame.AbsoluteSize.Y - local pixelsRemaining = frame.AbsoluteSize.Y + local pixelsRemaining = totalPixels for _, child in ipairs(guiObjects) do if child:IsA("TextLabel" or child:IsA("TextButton")) then local isLabel = child:IsA("TextLabel") @@ -695,7 +695,7 @@ t.CreateSlider = function(steps, width, position) Visible = false, ZIndex = 4 }) - local sliderPosition, sliderSteps, slider, bar = sliderGui.SliderPosition, sliderGui.SliderSteps, sliderGui.Bar.Slider, sliderGui.Bar + local slider, bar, sliderPosition, sliderSteps = sliderGui.Bar.Slider, sliderGui.Bar, sliderGui.SliderPosition, sliderGui.SliderSteps sliderGui.AncestryChanged:connect(function(_, parent) if not (parent ~= nil) then areaSoak.Parent = nil @@ -719,7 +719,7 @@ t.CreateSlider = function(steps, width, position) end) slider.MouseButton1Down:connect(function() areaSoak.Visible = true - if areaSoakMouseMoveCon then + if areaSoakMouseMoveCon ~= nil then areaSoakMouseMoveCon:disconnect() end areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x, _) @@ -743,11 +743,11 @@ t.CreateTrueScrollingFrame = function() local lowY, highY local dragCon, upCon local internalChange = false - local descendantsChangeConMap = { } + local desantsChangeConMap = { } local scrollingFrame = New("Frame", "ScrollingFrame", { Active = true, Size = UDim2.new(1, 0, 1, 0), - ClipsDescendants = true, + ClipsDesants = true, New("Frame", "ControlFrame", { BackgroundTransparency = 1, Size = UDim2.new(0, 18, 1, 0), @@ -904,7 +904,7 @@ t.CreateTrueScrollingFrame = function() if instance == controlFrame then return end - if instance:IsDescendantOf(controlFrame) then + if instance:IsDesantOf(controlFrame) then return end if not instance.Visible then @@ -964,15 +964,14 @@ t.CreateTrueScrollingFrame = function() scrollbar.Visible = false scrollDownButton.Visible = false scrollUpButton.Visible = false - if dragCon then + if dragCon ~= nil then dragCon:disconnect() - dragCon = nil end - if upCon then + dragCon = nil + if upCon ~= nil then upCon:disconnect() - upCon = nil end - return + upCon = nil end local percentShown = scrollingFrame.AbsoluteSize.Y / totalYSpan if percentShown >= 1 then @@ -991,7 +990,7 @@ t.CreateTrueScrollingFrame = function() if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y then scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0) end - if (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then + if scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y > scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y then local relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0) end @@ -1086,18 +1085,18 @@ t.CreateTrueScrollingFrame = function() end end end - scrollbar.MouseButton1Down:connect(function(x, y) + scrollbar.MouseButton1Down:connect(function(_, y) if scrollbar.Active then - local scrollStamp = tick() + scrollStamp = tick() local mouseOffset = y - scrollbar.AbsolutePosition.y - if dragCon then + if dragCon ~= nil then dragCon:disconnect() - dragCon = nil end - if upCon then + dragCon = nil + if upCon ~= nil then upCon:disconnect() - upCon = nil end + upCon = nil local reentrancyGuardMouseScroll = false dragCon = mouseDrag.MouseMoved:connect(function(x, y) if reentrancyGuardMouseScroll then @@ -1145,8 +1144,8 @@ t.CreateTrueScrollingFrame = function() return setSliderSizeAndPosition() end end - local descendantChanged - descendantChanged = function(this, prop) + local desantChanged + desantChanged = function(this, prop) if internalChange then return end @@ -1158,7 +1157,7 @@ t.CreateTrueScrollingFrame = function() return highLowRecheck() end end - scrollingFrame.DescendantAdded:connect(function(instance) + scrollingFrame.DesantAdded:connect(function(instance) if not instance:IsA("GuiObject") then return end @@ -1166,17 +1165,17 @@ t.CreateTrueScrollingFrame = function() wait() highLowRecheck() end - descendantsChangeConMap[instance] = instance.Changed:connect(function(prop) - return descendantChanged(instance, prop) + desantsChangeConMap[instance] = instance.Changed:connect(function(prop) + return desantChanged(instance, prop) end) end) - scrollingFrame.DescendantRemoving:connect(function(instance) + scrollingFrame.DesantRemoving:connect(function(instance) if not instance:IsA("GuiObject") then return end - if descendantsChangeConMap[instance] then - descendantsChangeConMap[instance]:disconnect() - descendantsChangeConMap[instance] = nil + if desantsChangeConMap[instance] then + desantsChangeConMap[instance]:disconnect() + desantsChangeConMap[instance] = nil end wait() return highLowRecheck() @@ -1192,3 +1191,2258 @@ t.CreateTrueScrollingFrame = function() end) return scrollingFrame, controlFrame end +t.CreateScrollingFrame = function(orderList, scrollStyle) + local frame = New("Frame", "ScrollingFrame", { + BackgroundTransparency = 1, + Size = UDim2.new(1, 0, 1, 0) + }) + local scrollUpButton = New("ImageButton", "ScrollUpButton", { + BackgroundTransparency = 1, + Image = "rbxasset://textures/ui/scrollbuttonUp.png", + Size = UDim2.new(0, 17, 0, 17) + }) + local scrollDownButton = New("ImageButton", "ScrollDownButton", { + BackgroundTransparency = 1, + Image = "rbxasset://textures/ui/scrollbuttonDown.png", + Size = UDim2.new(0, 17, 0, 17) + }) + local scrollbar = New("ImageButton", "ScrollBar", { + Image = "rbxasset://textures/ui/scrollbar.png", + BackgroundTransparency = 1, + Size = UDim2.new(0, 18, 0, 150), + New("ImageButton", "ScrollDrag", { + Image = "http://www.roblox.com/asset/?id=61367186", + Size = UDim2.new(1, 0, 0, 16), + BackgroundTransparency = 1, + Active = true + }) + }) + local scrollDrag = scrollbar.scrollDrag + local mouseDrag = New("ImageButton", "mouseDrag", { + Active = false, + Size = UDim2.new(1.5, 0, 1.5, 0), + AutoButtonColor = false, + BackgroundTransparency = 1, + Position = UDim2.new(-0.25, 0, -0.25, 0), + ZIndex = 10 + }) + local scrollStamp = 0 + local style = "simple" + if scrollStyle and tostring(scrollStyle) then + style = scrollStyle + end + local scrollPosition = 1 + local rowSize = 0 + local howManyDisplayed = 0 + local layoutGridScrollBar + layoutGridScrollBar = function() + howManyDisplayed = 0 + local guiObjects = { } + if orderList then + for _, child in ipairs(orderList) do + if child.Parent == frame then + table.insert(guiObjects, child) + end + end + else + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA("GuiObject") then + table.insert(guiObjects, child) + end + end + end + end + if #guiObjects == 0 then + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + end + if scrollPosition > #guiObjects then + scrollPosition = #guiObjects + end + if scrollPosition < 1 then + scrollPosition = 1 + end + local totalPixelsY = frame.AbsoluteSize.Y + local pixelsRemainingY = frame.AbsoluteSize.Y + local totalPixelsX = frame.AbsoluteSize.X + local xCounter = 0 + local rowSizeCounter = 0 + local setRowSize = true + local pixelsBelowScrollbar = 0 + local pos = #guiObjects + local currentRowY = 0 + pos = scrollPosition + while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY do + xCounter = xCounter + guiObjects[pos].AbsoluteSize.X + if xCounter >= totalPixelsX then + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + currentRowY = 0 + xCounter = guiObjects[pos].AbsoluteSize.X + end + if guiObjects[pos].AbsoluteSize.Y > currentRowY then + currentRowY = guiObjects[pos].AbsoluteSize.Y + end + pos = pos + 1 + end + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + currentRowY = 0 + pos = scrollPosition - 1 + xCounter = 0 + while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 do + xCounter = xCounter + guiObjects[pos].AbsoluteSize.X + rowSizeCounter = rowSizeCounter + 1 + if xCounter >= totalPixelsX then + rowSize = rowSizeCounter - 1 + rowSizeCounter = 0 + xCounter = guiObjects[pos].AbsoluteSize.X + if pixelsBelowScrollbar + currentRowY <= totalPixelsY then + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + if scrollPosition <= rowSize then + scrollPosition = 1 + break + else + scrollPosition = scrollPosition - rowSize + end + currentRowY = 0 + else + break + end + end + if guiObjects[pos].AbsoluteSize.Y > currentRowY then + currentRowY = guiObjects[pos].AbsoluteSize.Y + end + pos = pos - 1 + end + if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) then + scrollPosition = 1 + end + xCounter = 0 + rowSizeCounter = 0 + setRowSize = true + local lastChildSize = 0 + local xOffset = 0 + local yOffset = 0 + if guiObjects[1] then + yOffset = math.ceil(math.floor(math.fmod(totalPixelsY, guiObjects[1].AbsoluteSize.X)) / 2) + xOffset = math.ceil(math.floor(math.fmod(totalPixelsX, guiObjects[1].AbsoluteSize.Y)) / 2) + end + for i, child in ipairs(guiObjects) do + if i < scrollPosition then + child.Visible = false + else + if pixelsRemainingY < 0 then + child.Visible = false + else + if setRowSize then + rowSizeCounter = rowSizeCounter + 1 + end + if xCounter + child.AbsoluteSize.X >= totalPixelsX then + if setRowSize then + rowSize = rowSizeCounter - 1 + setRowSize = false + end + xCounter = 0 + pixelsRemainingY = pixelsRemainingY - child.AbsoluteSize.Y + end + child.Position = UDim2.new(child.Position.X.Scale, xCounter + xOffset, 0, totalPixelsY - pixelsRemainingY + yOffset) + xCounter = xCounter + child.AbsoluteSize.X + child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) + if child.Visible then + howManyDisplayed = howManyDisplayed + 1 + end + lastChildSize = child.AbsoluteSize + end + end + end + scrollUpButton.Active = (scrollPosition > 1) + if lastChildSize == 0 then + scrollDownButton.Active = false + else + scrollDownButton.Active = (pixelsRemainingY - lastChildSize.Y) < 0 + end + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active + end + local layoutSimpleScrollBar + layoutSimpleScrollBar = function() + local guiObjects = { } + howManyDisplayed = 0 + if orderList then + for _, child in ipairs(orderList) do + if child.Parent == frame then + table.insert(guiObjects, child) + end + end + else + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA("GuiObject") then + table.insert(guiObjects, child) + end + end + end + end + if #guiObjects == 0 then + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + end + if scrollPosition > #guiObjects then + scrollPosition = #guiObjects + end + local totalPixels = frame.AbsoluteSize.Y + local pixelsRemaining = frame.AbsoluteSize.Y + local pixelsBelowScrollbar = 0 + local pos = #guiObjects + while pixelsBelowScrollbar < totalPixels and pos >= 1 do + if pos >= scrollPosition then + pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + else + if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels then + pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + if scrollPosition <= 1 then + scrollPosition = 1 + break + else + scrollPosition = scrollPosition - 1 + end + else + break + end + end + pos = pos - 1 + end + pos = scrollPosition + for i, child in ipairs(guiObjects) do + if i < scrollPosition then + child.Visible = false + else + if pixelsRemaining < 0 then + child.Visible = false + else + child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + if pixelsRemaining >= 0 then + child.Visible = true + howManyDisplayed = howManyDisplayed + 1 + else + child.Visible = false + end + end + end + end + scrollUpButton.Active = (scrollPosition > 1) + scrollDownButton.Active = (pixelsRemaining < 0) + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active + end + local moveDragger + moveDragger = function() + local guiObjects = 0 + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA("GuiObject") then + guiObjects = guiObjects + 1 + end + end + end + if not scrollDrag.Parent then + return + end + local dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1 / (guiObjects - howManyDisplayed + 1)) + if dragSizeY < 16 then + dragSizeY = 16 + end + scrollDrag.Size = UDim2.new(scrollDrag.Size.X.Scale, scrollDrag.Size.X.Offset, scrollDrag.Size.Y.Scale, dragSizeY) + local relativeYPos = (scrollPosition - 1) / (guiObjects - howManyDisplayed) + if relativeYPos > 1 then + relativeYPos = 1 + elseif relativeYPos < 0 then + relativeYPos = 0 + end + local absYPos = 0 + if relativeYPos ~= 0 then + absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) + end + scrollDrag.Position = UDim2.new(scrollDrag.Position.X.Scale, scrollDrag.Position.X.Offset, scrollDrag.Position.Y.Scale, absYPos) + end + local reentrancyGuard = false + local recalculate + recalculate = function() + if reentrancyGuard then + return + end + reentrancyGuard = true + wait() + local success, err + if style == "grid" then + success, err = pcall(function() + return layoutGridScrollBar() + end) + elseif style == "simple" then + success, err = pcall(function() + return layoutSimpleScrollBar() + end) + end + if not success then + print(err) + end + moveDragger() + reentrancyGuard = false + end + local doScrollUp + doScrollUp = function() + scrollPosition = scrollPosition - rowSize + if scrollPosition < 1 then + scrollPosition = 1 + end + return recalculate(nil) + end + local doScrollDown + doScrollDown = function() + scrollPosition = scrollPosition + rowSize + return recalculate(nil) + end + local scrollUp + scrollUp = function(mouseYPos) + if scrollUpButton.Active then + scrollStamp = tick() + local current = scrollStamp + local upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + return upCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollUp() + wait(0.2) + t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollUp() + if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y then + break + end + if not scrollUpButton.Active then + break + end + if tick() - t > 5 then + w = 0 + elseif tick() - t > 2 then + w = 0.06 + end + wait(w) + end + end + end + local scrollDown + scrollDown = function(mouseYPos) + if scrollDownButton.Active then + scrollStamp = tick() + local current = scrollStamp + local downCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + return downCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollDown() + wait(0.2) + t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollDown() + if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) then + break + end + if not scrollDownButton.Active then + break + end + if tick() - t > 5 then + w = 0 + elseif tick() - t > 2 then + w = 0.06 + end + wait(w) + end + end + end + scrollDrag.MouseButton1Down:connect(function(_, y) + if scrollDrag.Active then + scrollStamp = tick() + local mouseOffset = y - scrollDrag.AbsolutePosition.y + local dragCon, upCon + dragCon = mouseDrag.MouseMoved:connect(function(_, y) + local barAbsPos = scrollbar.AbsolutePosition.y + local barAbsSize = scrollbar.AbsoluteSize.y + local dragAbsSize = scrollDrag.AbsoluteSize.y + local barAbsOne = barAbsPos + barAbsSize - dragAbsSize + y = y - mouseOffset + y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y + y = y - barAbsPos + local guiObjects = 0 + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA("GuiObject") then + guiObjects = guiObjects + 1 + end + end + end + local doublePercent = y / (barAbsSize - dragAbsSize) + local rowDiff = rowSize + local totalScrollCount = guiObjects - (howManyDisplayed - 1) + local newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff + if newScrollPosition < scrollPosition then + rowDiff = -rowDiff + end + if newScrollPosition < 1 then + newScrollPosition = 1 + end + scrollPosition = newScrollPosition + return recalculate(nil) + end) + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + dragCon:disconnect() + dragCon = nil + upCon:disconnect() + local drag = nil + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + end + end) + local scrollMouseCount = 0 + scrollUpButton.MouseButton1Down:connect(function() + return scrollUp() + end) + scrollDownButton.MouseButton1Down:connect(function() + return scrollDown() + end) + scrollUpButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollDownButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollbar.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollbar.MouseButton1Down:connect(function(_, y) + if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y) then + return scrollDown(y) + elseif y < scrollDrag.AbsolutePosition.y then + return scrollUp(y) + end + end) + frame.ChildAdded:connect(function() + return recalculate(nil) + end) + frame.ChildRemoved:connect(function() + return recalculate(nil) + end) + frame.AncestryChanged:connect(function() + return recalculate(nil) + end) + frame.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + return recalculate(nil) + end + end) + return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar +end +local binaryGrow +binaryGrow = function(min, max, fits) + if min > max then + return min + end + local biggestLegal = min + while min <= max do + local mid = min + math.floor((max - min) / 2) + if fits(mid) and (not (biggestLegal ~= nil) or biggestLegal < mid) then + biggestLegal = mid + min = mid + 1 + else + max = mid - 1 + end + end + return biggestLegal +end +local binaryShrink +binaryShrink = function(min, max, fits) + if min > max then + return min + end + local smallestLegal = max + while min <= max do + local mid = min + math.floor((max - min) / 2) + if fits(mid) and (not (smallestLegal ~= nil) or smallestLegal > mid) then + smallestLegal = mid + max = mid - 1 + else + min = mid + 1 + end + end + return smallestLegal +end +local getGuiOwner +getGuiOwner = function(instance) + while (instance ~= nil) do + if instance:IsA("ScreenGui") or instance:IsA("BillboardGui") then + return instance + end + instance = instance.Parent + end +end +t.AutoTruncateTextObject = function(textLabel) + local text = textLabel.Text + local fullLabel = textLabel:Clone() + fullLabel.Name = "Full" .. tostring(textLabel.Name) + fullLabel.BorderSizePixel = 0 + fullLabel.BackgroundTransparency = 0 + fullLabel.Text = text + fullLabel.TextXAlignment = Enum.TextXAlignment.Center + fullLabel.Position = UDim2.new(0, -3, 0, 0) + fullLabel.Size = UDim2.new(0, 100, 1, 0) + fullLabel.Visible = false + fullLabel.Parent = textLabel + local shortText + local mouseEnterConnection + local mouseLeaveConnection + local checkForResize + checkForResize = function() + if not (getGuiOwner(textLabel) ~= nil) then + return + end + textLabel.Text = text + if textLabel.TextFits then + if mouseEnterConnection ~= nil then + mouseEnterConnection:disconnect() + end + mouseEnterConnection = nil + if mouseLeaveConnection ~= nil then + mouseLeaveConnection:disconnect() + end + mouseLeaveConnection = nil + else + local len = string.len(text) + textLabel.Text = tostring(text) .. "~" + local textSize = binaryGrow(0, len, function(pos) + if pos == 0 then + textLabel.Text = "~" + else + textLabel.Text = tostring(string.sub(text, 1, pos)) .. "~" + end + return textLabel.TextFits + end) + shortText = tostring(string.sub(text, 1, textSize)) .. "~" + textLabel.Text = shortText + if not fullLabel.TextFits then + fullLabel.Size = UDim2.new(0, 10000, 1, 0) + end + local fullLabelSize = binaryShrink(textLabel.AbsoluteSize.X, fullLabel.AbsoluteSize.X, function(size) + fullLabel.Size = UDim2.new(0, size, 1, 0) + return fullLabel.TextFits + end) + fullLabel.Size = UDim2.new(0, fullLabelSize + 6, 1, 0) + if not (mouseEnterConnection ~= nil) then + mouseEnterConnection = textLabel.MouseEnter:connect(function() + fullLabel.ZIndex = textLabel.ZIndex + 1 + fullLabel.Visible = true + end) + end + if not (mouseLeaveConnection ~= nil) then + mouseLeaveConnection = textLabel.MouseLeave:connect(function() + fullLabel.Visible = false + end) + end + end + end + textLabel.AncestryChanged:connect(checkForResize) + textLabel.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + return checkForResize() + end + end) + checkForResize() + local changeText + changeText = function(newText) + text = newText + fullLabel.Text = text + return checkForResize() + end + return textLabel, changeText +end +local TransitionTutorialPages +TransitionTutorialPages = function(fromPage, toPage, transitionFrame, currentPageValue) + if fromPage then + fromPage.Visible = false + if transitionFrame.Visible == false then + transitionFrame.Size = fromPage.Size + transitionFrame.Position = fromPage.Position + end + elseif transitionFrame.Visible == false then + transitionFrame.Size = UDim2.new(0, 50, 0, 50) + transitionFrame.Position = UDim2.new(0.5, -25, 0.5, -25) + end + transitionFrame.Visible = true + currentPageValue.Value = nil + local newSize, newPosition + if toPage then + toPage.Visible = true + newSize = toPage.Size + newPosition = toPage.Position + toPage.Visible = false + else + newSize = UDim2.new(0, 50, 0, 50) + newPosition = UDim2.new(0.5, -25, 0.5, -25) + end + return transitionFrame:TweenSizeAndPosition(newSize, newPosition, Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.3, true, function(state) + if state == Enum.TweenStatus.Completed then + transitionFrame.Visible = false + if toPage then + toPage.Visible = true + currentPageValue.Value = toPage + end + end + end) +end +t.CreateTutorial = function(name, tutorialKey, createButtons) + local frame = New("Frame", "Tutorial-" .. tostring(name), { + BackgroundTransparency = 1, + Size = UDim2.new(0.6, 0, 0.6, 0), + Position = UDim2.new(0.2, 0, 0.2, 0), + New("Frame", "TransitionFrame", { + Style = Enum.FrameStyle.RobloxRound, + Size = UDim2.new(0.6, 0, 0.6, 0), + Position = UDim2.new(0.2, 0, 0.2, 0), + Visible = false + }), + New("ObjectValue", "CurrentTutorialPage", { + Value = nil + }), + New("BoolValue", "Buttons", { + Value = createButtons + }), + New("Frame", "Pages", { + BackgroundTransparency = 1, + Size = UDim2.new(1, 0, 1, 0) + }) + }) + local transitionFrame, currentPageValue, pages = frame.TransitionFrame, frame.CurrentTutorialPage, frame.Pages + local getVisiblePageAndHideOthers + getVisiblePageAndHideOthers = function() + local visiblePage + local children = pages:GetChildren() + if children then + for _, child in ipairs(children) do + if child.Visible then + if visiblePage then + child.Visible = false + else + visiblePage = child + end + end + end + end + return visiblePage + end + local showTutorial + showTutorial = function(alwaysShow) + if alwaysShow or UserSettings().GameSettings:GetTutorialState(tutorialKey) == false then + print("Showing tutorial-", tutorialKey) + local currentTutorialPage = getVisiblePageAndHideOthers() + local firstPage = pages:FindFirstChild("TutorialPage1") + if firstPage then + return TransitionTutorialPages(currentTutorialPage, firstPage, transitionFrame, currentPageValue) + else + return error("Could not find TutorialPage1") + end + end + end + local dismissTutorial + dismissTutorial = function() + local currentTutorialPage = getVisiblePageAndHideOthers() + if currentTutorialPage then + TransitionTutorialPages(currentTutorialPage, nil, transitionFrame, currentPageValue) + end + return UserSettings().GameSettings:SetTutorialState(tutorialKey, true) + end + local gotoPage + gotoPage = function(pageNum) + local page = pages:FindFirstChild("TutorialPage" .. tostring(pageNum)) + local currentTutorialPage = getVisiblePageAndHideOthers() + return TransitionTutorialPages(currentTutorialPage, page, transitionFrame, currentPageValue) + end + return frame, showTutorial, dismissTutorial, gotoPage +end +local CreateBasicTutorialPage +CreateBasicTutorialPage = function(name, handleResize, skipTutorial, giveDoneButton) + local frame = New("Frame", "TutorialPage", { + Style = Enum.FrameStyle.RobloxRound, + Size = UDim2.new(0.6, 0, 0.6, 0), + Position = UDim2.new(0.2, 0, 0.2, 0), + Visible = false, + New("TextLabel", "Header", { + Text = name, + BackgroundTransparency = 1, + FontSize = Enum.FontSize.Size24, + Font = Enum.Font.ArialBold, + TextColor3 = Color3.new(1, 1, 1), + TextXAlignment = Enum.TextXAlignment.Center, + TextWrap = true, + Size = UDim2.new(1, -55, 0, 22), + Position = UDim2.new(0, 0, 0, 0) + }), + New("ImageButton", "SkipButton", { + AutoButtonColor = false, + BackgroundTransparency = 1, + Image = "rbxasset://textures/ui/closeButton.png", + Size = UDim2.new(0, 25, 0, 25), + Position = UDim2.new(1, -25, 0, 0) + }), + New("TextButton", "NextButton", { + Text = "Next", + TextColor3 = Color3.new(1, 1, 1), + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + Style = Enum.ButtonStyle.RobloxButtonDefault, + Size = UDim2.new(0, 80, 0, 32), + Position = UDim2.new(0.5, 5, 1, -32), + Active = false, + Visible = false + }), + New("TextButton", "PrevButton", { + Text = "Previous", + TextColor3 = Color3.new(1, 1, 1), + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + Style = Enum.ButtonStyle.RobloxButton, + Size = UDim2.new(0, 80, 0, 32), + Position = UDim2.new(0.5, -85, 1, -32), + Active = false, + Visible = false + }), + New("Frame", "ContentFrame", { + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 25) + }) + }) + local innerFrame = frame.ContentFrame + do + local _with_0 = frame.SkipButton + _with_0.MouseButton1Click:connect(function() + return skipTutorial() + end) + _with_0.MouseEnter:connect(function() + _with_0.Image = "rbxasset://textures/ui/closeButton_dn.png" + end) + _with_0.MouseLeave:connect(function() + _with_0.Image = "rbxasset://textures/ui/closeButton.png" + end) + end + if giveDoneButton then + local doneButton = New("TextButton", "DoneButton", { + Style = Enum.ButtonStyle.RobloxButtonDefault, + Text = "Done", + TextColor3 = Color3.new(1, 1, 1), + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size18, + Size = UDim2.new(0, 100, 0, 50), + Position = UDim2.new(0.5, -50, 1, -50), + Parent = frame + }) + if skipTutorial then + doneButton.MouseButton1Click:connect(function() + return skipTutorial() + end) + end + end + if giveDoneButton then + innerFrame.Size = UDim2.new(1, 0, 1, -75) + else + innerFrame.Size = UDim2.new(1, 0, 1, -22) + end + local parentConnection + local basicHandleResize + basicHandleResize = function() + if frame.Visible and frame.Parent then + local maxSize = math.min(frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y) + return handleResize(200, maxSize) + end + end + frame.Changed:connect(function(prop) + if prop == "Parent" then + if parentConnection ~= nil then + parentConnection:disconnect() + end + parentConnection = nil + if frame.Parent and frame.Parent:IsA("GuiObject") then + parentConnection = frame.Parent.Changed:connect(function(parentProp) + if parentProp == "AbsoluteSize" then + wait() + return basicHandleResize() + end + end) + basicHandleResize() + end + end + if prop == "Visible" then + return basicHandleResize() + end + end) + return frame, innerFrame +end +t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) + local frame + local textLabel = New("TextLabel", { + BackgroundTransparency = 1, + TextColor3 = Color3.new(1, 1, 1), + Text = text, + TextWrap = true, + TextXAlignment = Enum.TextXAlignment.Left, + TextYAlignment = Enum.TextYAlignment.Center, + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size14, + Size = UDim2.new(1, 0, 1, 0) + }) + local handleResize + handleResize = function(minSize, maxSize) + local size = binaryShrink(minSize, maxSize, function(size) + frame.Size = UDim2.new(0, size, 0, size) + return textLabel.TextFits + end) + frame.Size = UDim2.new(0, size, 0, size) + frame.Position = UDim2.new(0.5, -size / 2, 0.5, -size / 2) + end + local contentFrame + frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) + textLabel.Parent = contentFrame + return frame +end +t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) + local frame, contentFrame + local imageLabel = New("ImageLabel", { + BackgroundTransparency = 1, + Image = imageAsset, + Size = UDim2.new(0, x, 0, y), + Position = UDim2.new(0.5, -x / 2, 0.5, -y / 2) + }) + local handleResize + handleResize = function(minSize, maxSize) + local size = binaryShrink(minSize, maxSize, function(size) + return size >= x and size >= y + end) + if size >= x and size >= y then + imageLabel.Size = UDim2.new(0, x, 0, y) + imageLabel.Position = UDim2.new(0.5, -x / 2, 0.5, -y / 2) + else + if x > y then + imageLabel.Size, imageLabel.Position = UDim2.new(1, 0, y / x, 0), UDim2.new(0, 0, 0.5 - (y / x) / 2, 0) + else + imageLabel.Size, imageLabel.Position = UDim2.new(x / y, 0, 1, 0), UDim2.new(0.5 - (x / y) / 2, 0, 0, 0) + end + end + size = size + 50 + frame.Size = UDim2.new(0, size, 0, size) + frame.Position = UDim2.new(0.5, -size / 2, 0.5, -size / 2) + end + frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc, giveDoneButton) + imageLabel.Parent = contentFrame + return frame +end +t.AddTutorialPage = function(tutorial, tutorialPage) + local transitionFrame = tutorial.TransitionFrame + local currentPageValue = tutorial.CurrentTutorialPage + if not tutorial.Buttons.Value then + tutorialPage.NextButton.Parent = nil + tutorialPage.PrevButton.Parent = nil + end + local children = tutorial.Pages:GetChildren() + if children and #children > 0 then + tutorialPage.Name = "TutorialPage" .. tostring(#children + 1) + local previousPage = children[#children] + if not previousPage:IsA("GuiObject") then + error("All elements under Pages must be GuiObjects") + end + if tutorial.Buttons.Value then + if previousPage.NextButton.Active then + error("NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function") + end + previousPage.NextButton.MouseButton1Click:connect(function() + return TransitionTutorialPages(previousPage, tutorialPage, transitionFrame, currentPageValue) + end) + previousPage.NextButton.Active = true + previousPage.NextButton.Visible = true + if tutorialPage.PrevButton.Active then + error("PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function") + end + tutorialPage.PrevButton.MouseButton1Click:connect(function() + return TransitionTutorialPages(tutorialPage, previousPage, transitionFrame, currentPageValue) + end) + tutorialPage.PrevButton.Active = true + tutorialPage.PrevButton.Visible = true + end + tutorialPage.Parent = tutorial.Pages + else + tutorialPage.Name = "TutorialPage1" + tutorialPage.Parent = tutorial.Pages + end +end +t.CreateSetPanel = function(userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) + if not userIdsForSets then + error("CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids") + end + if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" then + error("CreateSetPanel: userIdsForSets (first arg) is of type " .. tostring(type(userIdsForSets)) .. ", should be of type table or userdata") + end + if not objectSelected then + error("CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!") + end + if type(objectSelected) ~= "function" then + error("CreateSetPanel: objectSelected (second arg) is of type " .. tostring(type(objectSelected)) .. ", should be of type function!") + end + if dialogClosed and type(dialogClosed) ~= "function" then + error("CreateSetPanel: dialogClosed (third arg) is of type " .. tostring(type(dialogClosed)) .. ", should be of type function!") + end + if not (showAdminCategories ~= nil) then + showAdminCategories = false + end + local arrayPosition = 1 + local insertButtons = { } + local insertButtonCons = { } + local contents, setGui + local waterForceDirection = "NegX" + local waterForce = "None" + local waterGui, waterTypeChangedEvent + local Data = { } + Data.CurrentCategory = nil + Data.Category = { } + local SetCache = { } + local userCategoryButtons + local buttonWidth = 64 + local buttonHeight = buttonWidth + local SmallThumbnailUrl, LargeThumbnailUrl + local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() + if useAssetVersionId then + LargeThumbnailUrl, SmallThumbnailUrl = tostring(BaseUrl) .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=", tostring(BaseUrl) .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" + else + LargeThumbnailUrl, SmallThumbnailUrl = tostring(BaseUrl) .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=", tostring(BaseUrl) .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" + end + local drillDownSetZIndex + drillDownSetZIndex = function(parent, index) + local children = parent:GetChildren() + for i = 1, #children do + if children[i]:IsA("GuiObject") then + children[i].ZIndex = index + end + drillDownSetZIndex(children[i], index) + end + end + local currTerrainDropDownFrame + local terrainShapes = { + "Block", + "Vertical Ramp", + "Corner Wedge", + "Inverse Corner Wedge", + "Horizontal Ramp", + "Auto-Wedge" + } + local terrainShapeMap = { } + for i = 1, #terrainShapes do + terrainShapeMap[terrainShapes[i]] = i - 1 + end + terrainShapeMap[terrainShapes[#terrainShapes]] = 6 + local createWaterGui + createWaterGui = function() + local waterForceDirections = { + "NegX", + "X", + "NegY", + "Y", + "NegZ", + "Z" + } + local waterForces = { + "None", + "Small", + "Medium", + "Strong", + "Max" + } + local waterFrame = New("Frame", "WaterFrame", { + Style = Enum.FrameStyle.RobloxSquare, + Size = UDim2.new(0, 150, 0, 110), + Visible = false + }) + local waterForceLabel = New("TextLabel", "WaterForceLabel", { + BackgroundTransparency = 1, + Size = UDim2.new(1, 0, 0, 12), + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size12, + TextColor3 = Color3.new(1, 1, 1), + TextXAlignment = Enum.TextXAlignment.Left, + Text = "Water Force", + Parent = waterFrame + }) + local waterForceDirLabel = waterForceLabel:Clone() + waterForceDirLabel.Name = "WaterForceDirectionLabel" + waterForceDirLabel.Text = "Water Force Direction" + waterForceDirLabel.Position = UDim2.new(0, 0, 0, 50) + waterForceDirLabel.Parent = waterFrame + waterTypeChangedEvent = New("BindableEvent", "WaterTypeChangedEvent", { + Parent = waterFrame + }) + local waterForceDirectionSelectedFunc + waterForceDirectionSelectedFunc = function(newForceDirection) + waterForceDirection = newForceDirection + return waterTypeChangedEvent:Fire({ + waterForce, + waterForceDirection + }) + end + local waterForceSelectedFunc + waterForceSelectedFunc = function(newForce) + waterForce = newForce + return waterTypeChangedEvent:Fire({ + waterForce, + waterForceDirection + }) + end + local waterForceDirectionDropDown, forceWaterDirectionSelection = t.CreateDropDownMenu(waterForceDirections, waterForceDirectionSelectedFunc) + waterForceDirectionDropDown.Size = UDim2.new(1, 0, 0, 25) + waterForceDirectionDropDown.Position = UDim2.new(0, 0, 1, 3) + forceWaterDirectionSelection("NegX") + waterForceDirectionDropDown.Parent = waterForceDirLabel + local waterForceDropDown, forceWaterForceSelection = t.CreateDropDownMenu(waterForces, waterForceSelectedFunc) + forceWaterForceSelection("None") + waterForceDropDown.Size = UDim2.new(1, 0, 0, 25) + waterForceDropDown.Position = UDim2.new(0, 0, 1, 3) + waterForceDropDown.Parent = waterForceLabel + return waterFrame, waterTypeChangedEvent + end + local createSetGui + createSetGui = function() + setGui = Instance.new("ScreenGui") + setGui.Name = "SetGui" + local setPanel = New("Frame", "SetPanel", { + Active = true, + BackgroundTransparency = 1, + Position = position or UDim2.new(0.2, 29, 0.1, 24), + Size = size or UDim2.new(0.6, -58, 0.64, 0), + Style = Enum.FrameStyle.RobloxRound, + ZIndex = 6, + Parent = setGui, + New("TextButton", "CancelButton", { + Position = UDim2.new(1, -32, 0, -2), + Size = UDim2.new(0, 34, 0, 34), + Style = Enum.ButtonStyle.RobloxButtonDefault, + ZIndex = 6, + Text = "", + Modal = true, + New("ImageLabel", "CancelImage", { + BackgroundTransparency = 1, + Image = "http://www.roblox.com/asset?id=54135717", + Position = UDim2.new(0, -2, 0, -2), + Size = UDim2.new(0, 16, 0, 16), + ZIndex = 6 + }) + }), + New("Frame", "ItemPreview", { + BackgroundTransparency = 1, + Position = UDim2.new(0.8, 5, 0.085, 0), + Size = UDim2.new(0.21, 0, 0.9, 0), + ZIndex = 6, + New("ImageLabel", "LargePreview", { + BackgroundTransparency = 1, + Image = "", + Size = UDim2.new(1, 0, 0, 170), + ZIndex = 6 + }), + New("Frame", "TextPanel", { + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0.45, 0), + Size = UDim2.new(1, 0, 0.55, 0), + ZIndex = 6, + New("TextLabel", "RolloverText", { + BackgroundTransparency = 1, + Size = UDim2.new(1, 0, 0, 48), + ZIndex = 6, + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size24, + Text = "", + TextColor3 = Color3.new(1, 1, 1), + TextWrap = true, + TextXAlignment = Enum.TextXAlignment.Left, + TextYAlignment = Enum.TextYAlignment.Top + }) + }) + }), + New("Frame", "Sets", { + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 5), + Size = UDim2.new(0.23, 0, 1, -5), + ZIndex = 6, + New("Frame", "Line", { + BackgroundColor3 = Color3.new(1, 1, 1), + BackgroundTransparency = 0.7, + BorderSizePixel = 0, + Position = UDim2.new(1, -3, 0.06, 0), + Size = UDim2.new(0, 3, 0.9, 0), + ZIndex = 6 + }), + New("TextLabel", "SetsHeader", { + BackgroundTransparency = 1, + Size = UDim2.new(0, 47, 0, 24), + ZIndex = 6, + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size24, + Text = "Sets", + TextColor3 = Color3.new(1, 1, 1), + TextXAlignment = Enum.TextXAlignment.Left, + TextYAlignment = Enum.TextYAlignment.Top + }) + }) + }) + local setsLists, controlFrame = t.CreateTrueScrollingFrame() + setsLists.Size = UDim2.new(1, -6, 0.94, 0) + setsLists.Position = UDim2.new(0, 0, 0.06, 0) + setsLists.BackgroundTransparency = 1 + setsLists.Name = "SetsLists" + setsLists.ZIndex = 6 + setsLists.Parent = setPanel.Sets + drillDownSetZIndex(controlFrame, 7) + return setGui + end + local createSetButton + createSetButton = function(text) + local setButton = New("TextButton", { + Text = text or "", + AutoButtonColor = false, + BackgroundTransparency = 1, + BackgroundColor3 = Color3.new(1, 1, 1), + BorderSizePixel = 0, + Size = UDim2.new(1, -5, 0, 18), + ZIndex = 6, + Visible = false, + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + TextColor3 = Color3.new(1, 1, 1), + TextXAlignment = Enum.TextXAlignment.Left + }) + return setButton + end + local buildSetButton + buildSetButton = function(name, setId, _, _, _) + local button = createSetButton(name) + button.Text = name + button.Name = "SetButton" + button.Visible = true + New("IntValue", "SetId", { + Value = setId, + Parent = button + }) + New("StringValue", "SetName", { + Value = name, + Parent = button + }) + return button + end + local processCategory + processCategory = function(sets) + local setButtons = { } + local numSkipped = 0 + for i = 1, #sets do + if not showAdminCategories and sets[i].Name == "Beta" then + numSkipped = numSkipped + 1 + else + setButtons[i - numSkipped] = buildSetButton(sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets) + end + end + return setButtons + end + local handleResize + handleResize = function() + wait() + local _with_0 = setGui.SetPanel.ItemPreview + _with_0.LargePreview.Size = UDim2.new(1, 0, 0, _with_0.AbsoluteSize.X) + _with_0.LargePreview.Position = UDim2.new(0.5, -_with_0.LargePreview.AbsoluteSize.X / 2, 0, 0) + _with_0.TextPanel.Position = UDim2.new(0, 0, 0, _with_0.LargePreview.AbsoluteSize.Y) + _with_0.TextPanel.Size = UDim2.new(1, 0, 0, _with_0.AbsoluteSize.Y - _with_0.LargePreview.AbsoluteSize.Y) + return _with_0 + end + local makeInsertAssetButton + makeInsertAssetButton = function() + local insertAssetButtonExample = New("Frame", "InsertAssetButtonExample", { + Position = UDim2.new(0, 128, 0, 64), + Size = UDim2.new(0, 64, 0, 64), + BackgroundTransparency = 1, + ZIndex = 6, + Visible = false, + New("IntValue", "AssetId", { + Value = 0 + }), + New("StringValue", "AssetName", { + Value = "" + }), + New("TextButton", "Button", { + Text = "", + Style = Enum.ButtonStyle.RobloxButton, + Position = UDim2.new(0.025, 0, 0.025, 0), + Size = UDim2.new(0.95, 0, 0.95, 0), + ZIndex = 6, + New("ImageLabel", "ButtonImage", { + Image = "", + Position = UDim2.new(0, -7, 0, -7), + Size = UDim2.new(1, 14, 1, 14), + BackgroundTransparency = 1, + ZIndex = 7 + }) + }) + }) + do + local _with_0 = insertAssetButtonExample.button.ButtonImage:clone() + _with_0.Name = "ConfigIcon" + _with_0.Visible = false + _with_0.Position = UDim2.new(1, -23, 1, -24) + _with_0.Size = UDim2.new(0, 16, 0, 16) + _with_0.Image = "" + _with_0.ZIndex = 6 + _with_0.Parent = insertAssetButtonExample + end + return insertAssetButtonExample + end + local showLargePreview + showLargePreview = function(insertButton) + if insertButton:FindFirstChild("AssetId") then + delay(0, function() + game:GetService("ContentProvider"):Preload(LargeThumbnailUrl .. tostring(insertButton.AssetId.Value)) + setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl .. tostring(insertButton.AssetId.Value) + end) + end + if insertButton:FindFirstChild("AssetName") then + setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value + end + end + local selectTerrainShape + selectTerrainShape = function(shape) + if currTerrainDropDownFrame then + return objectSelected(tostring(currTerrainDropDownFrame.AssetName.Value), tonumber(currTerrainDropDownFrame.AssetId.Value), shape) + end + end + local createTerrainTypeButton + createTerrainTypeButton = function(name, parent) + local dropDownTextButton = New("TextButton", tostring(name) .. "Button", { + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size14, + BorderSizePixel = 0, + TextColor3 = Color3.new(1, 1, 1), + Text = name, + TextXAlignment = Enum.TextXAlignment.Left, + BackgroundTransparency = 1, + ZIndex = parent.ZIndex + 1, + Size = UDim2.new(0, parent.Size.X.Offset - 2, 0, 16), + Position = UDim2.new(0, 1, 0, 0) + }) + dropDownTextButton.MouseEnter:connect(function() + dropDownTextButton.BackgroundTransparency = 0 + dropDownTextButton.TextColor3 = Color3.new(0, 0, 0) + end) + dropDownTextButton.MouseLeave:connect(function() + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + end) + dropDownTextButton.MouseButton1Click:connect(function() + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + if dropDownTextButton.Parent and dropDownTextButton.Parent:IsA("GuiObject") then + dropDownTextButton.Parent.Visible = false + end + return selectTerrainShape(terrainShapeMap[dropDownTextButton.Text]) + end) + return dropDownTextButton + end + local createTerrainDropDownMenu + createTerrainDropDownMenu = function(zIndex) + local dropDown = New("Frame", "TerrainDropDown", { + BackgroundColor3 = Color3.new(0, 0, 0), + BorderColor3 = Color3.new(1, 0, 0), + Size = UDim2.new(0, 200, 0, 0), + Visible = false, + ZIndex = zIndex, + Parent = setGui + }) + for i = 1, #terrainShapes do + local shapeButton = createTerrainTypeButton(terrainShapes[i], dropDown) + shapeButton.Position = UDim2.new(0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset) + shapeButton.Parent = dropDown + dropDown.Size = UDim2.new(0, 200, 0, dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset) + end + return dropDown.MouseLeave:connect(function() + dropDown.Visible = false + end) + end + local createDropDownMenuButton + createDropDownMenuButton = function(parent) + local dropDownButton = New("ImageButton", { + Name = "DropDownButton", + Image = "http://www.roblox.com/asset/?id=67581509", + BackgroundTransparency = 1, + Size = UDim2.new(0, 16, 0, 16), + Position = UDim2.new(1, -24, 0, 6), + ZIndex = parent.ZIndex + 2, + Parent = parent + }) + if not setGui:FindFirstChild("TerrainDropDown") then + createTerrainDropDownMenu(8) + end + return dropDownButton.MouseButton1Click:connect(function() + setGui.TerrainDropDown.Visible = true + setGui.TerrainDropDown.Position = UDim2.new(0, parent.AbsolutePosition.X, 0, parent.AbsolutePosition.Y) + currTerrainDropDownFrame = parent + end) + end + local buildInsertButton + buildInsertButton = function() + local insertButton = makeInsertAssetButton() + insertButton.Name = "InsertAssetButton" + insertButton.Visible = true + if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then + createDropDownMenuButton(insertButton) + end + local lastEnter = nil + local mouseEnterCon = insertButton.MouseEnter:connect(function() + lastEnter = insertButton + return delay(0.1, function() + if lastEnter == insertButton then + return showLargePreview(insertButton) + end + end) + end) + return insertButton, mouseEnterCon + end + local realignButtonGrid + realignButtonGrid = function(columns) + local x = 0 + local y = 0 + for i = 1, #insertButtons do + insertButtons[i].Position = UDim2.new(0, buttonWidth * x, 0, buttonHeight * y) + x = x + 1 + if x >= columns then + x = 0 + y = y + 1 + end + end + end + local setInsertButtonImageBehavior + setInsertButtonImageBehavior = function(insertFrame, visible, name, assetId) + if visible then + insertFrame.AssetName.Value = name + insertFrame.AssetId.Value = assetId + local newImageUrl = SmallThumbnailUrl .. assetId + if newImageUrl ~= insertFrame.Button.ButtonImage.Image then + delay(0, function() + game:GetService("ContentProvider"):Preload(SmallThumbnailUrl .. assetId) + insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId + end) + end + table.insert(insertButtonCons, insertFrame.Button.MouseButton1Click:connect(function() + local isWaterSelected = name == "Water" and (Data.Category[Data.CurrentCategory].SetName == "High Scalability") + waterGui.Visible = isWaterSelected + return objectSelected(name, (function() + if isWaterSelected then + return tonumber(assetId), nil + else + return tonumber(assetId) + end + end)()) + end)) + insertFrame.Visible = true + else + insertFrame.Visible = false + end + end + local loadSectionOfItems + loadSectionOfItems = function(setGui, rows, columns) + local pageSize = rows * columns + if arrayPosition > #contents then + return + end + local origArrayPos = arrayPosition + for _ = 1, pageSize + 1 do + if arrayPosition >= #contents + 1 then + break + end + local buttonCon + insertButtons[arrayPosition], buttonCon = buildInsertButton() + table.insert(insertButtonCons, buttonCon) + insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame + arrayPosition = arrayPosition + 1 + end + realignButtonGrid(columns) + for index = origArrayPos, arrayPosition do + if insertButtons[index] then + if contents[index] then + if contents[index].Name == "Water" and Data.Category[Data.CurrentCategory].SetName == "High Scalability" then + insertButtons[index]:FindFirstChild("DropDownButton", true):Destroy() + end + local assetId + if useAssetVersionId then + assetId = contents[index].AssetVersionId + else + assetId = contents[index].AssetId + end + setInsertButtonImageBehavior(insertButtons[index], true, contents[index].Name, assetId) + else + break + end + else + break + end + end + end + local setSetIndex + setSetIndex = function() + Data.Category[Data.CurrentCategory].Index = 0 + local rows = 7 + local columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) + contents = Data.Category[Data.CurrentCategory].Contents + if contents then + for i = 1, #insertButtons do + insertButtons[i]:remove() + end + for i = 1, #insertButtonCons do + if insertButtonCons[i] then + insertButtonCons[i]:disconnect() + end + end + insertButtonCons = { } + insertButtons = { } + arrayPosition = 1 + return loadSectionOfItems(setGui, rows, columns) + end + end + local selectSet + selectSet = function(button, setName, setId, _) + if button and (Data.Category[Data.CurrentCategory] ~= nil) then + do + local _with_0 = Data.Category[Data.CurrentCategory] + if button ~= _with_0.Button then + _with_0.Button = button + if not (SetCache[setId] ~= nil) then + SetCache[setId] = game:GetService("InsertService"):GetCollection(setId) + end + _with_0.Contents = SetCache[setId] + _with_0.SetName = setName + _with_0.SetId = setId + end + end + return setSetIndex() + end + end + local selectCategoryPage + selectCategoryPage = function(buttons, _) + if buttons ~= Data.CurrentCategory then + if Data.CurrentCategory then + for _, button in pairs(Data.CurrentCategory) do + button.Visible = false + end + end + Data.CurrentCategory = buttons + if not (Data.Category[Data.CurrentCategory] ~= nil) then + Data.Category[Data.CurrentCategory] = { } + if #buttons > 0 then + return selectSet(buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0) + end + else + local _with_0 = Data.Category[Data.CurrentCategory] + _with_0.Button = nil + selectSet(_with_0.ButtonFrame, _with_0.SetName, _with_0.SetId, _with_0.Index) + return _with_0 + end + end + end + local selectCategory + selectCategory = function(category) + return selectCategoryPage(category, 0) + end + local resetAllSetButtonSelection + resetAllSetButtonSelection = function() + local setButtons = setGui.SetPanel.Sets.SetsLists:GetChildren() + for i = 1, #setButtons do + do + local _with_0 = setButtons[i] + if _with_0:IsA("TextButton") then + _with_0.Selected = false + _with_0.BackgroundTransparency = 1 + _with_0.TextColor3 = Color3.new(1, 1, 1) + _with_0.BackgroundColor3 = Color3.new(1, 1, 1) + end + end + end + end + local populateSetsFrame + populateSetsFrame = function() + local currRow = 0 + for i = 1, #userCategoryButtons do + do + local button = userCategoryButtons[i] + button.Visible = true + button.Position = UDim2.new(0, 5, 0, currRow * button.Size.Y.Offset) + button.Parent = setGui.SetPanel.Sets.SetsLists + if i == 1 then + button.Selected = true + button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundTransparency = 0 + end + button.MouseEnter:connect(function() + if not button.Selected then + button.BackgroundTransparency = 0 + button.TextColor3 = Color3.new(0, 0, 0) + end + end) + button.MouseLeave:connect(function() + if not button.Selected then + button.BackgroundTransparency = 1 + button.TextColor3 = Color3.new(1, 1, 1) + end + end) + button.MouseButton1Click:connect(function() + resetAllSetButtonSelection() + button.Selected = not button.Selected + button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundTransparency = 0 + return selectSet(button, button.Text, userCategoryButtons[i].SetId.Value, 0) + end) + currRow = currRow + 1 + end + end + local buttons = setGui.SetPanel.Sets.SetsLists:GetChildren() + if buttons then + for i = 1, #buttons do + if buttons[i]:IsA("TextButton") then + selectSet(buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0) + selectCategory(userCategoryButtons) + break + end + end + end + end + setGui = createSetGui() + waterGui, waterTypeChangedEvent = createWaterGui() + waterGui.Position = UDim2.new(0, 55, 0, 0) + waterGui.Parent = setGui + setGui.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + handleResize() + return setSetIndex() + end + end) + local scrollFrame, controlFrame = t.CreateTrueScrollingFrame() + scrollFrame.Name = "ItemsFrame" + scrollFrame.Size = UDim2.new(0.54, 0, 0.85, 0) + scrollFrame.Position = UDim2.new(0.24, 0, 0.085, 0) + scrollFrame.ZIndex = 6 + scrollFrame.Parent = setGui.SetPanel + scrollFrame.BackgroundTransparency = 1 + drillDownSetZIndex(controlFrame, 7) + controlFrame.Parent = setGui.SetPanel + controlFrame.Position = UDim2.new(0.76, 5, 0, 0) + local debounce = false + local rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight) + local columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) + controlFrame.ScrollBottom.Changed:connect(function(_) + if controlFrame.ScrollBottom.Value == true then + if debounce then + return + end + debounce = true + loadSectionOfItems(setGui, rows, columns) + debounce = false + end + end) + local userData = { } + for id = 1, #userIdsForSets do + local newUserData = game:GetService("InsertService"):GetUserSets(userIdsForSets[id]) + if newUserData and #newUserData > 2 then + for category = 3, #newUserData do + table.insert(userData, (function() + if newUserData[category].Name == "High Scalability" then + return 1, newUserData[category] + else + return newUserData[category] + end + end)()) + end + end + end + if userData then + userCategoryButtons = processCategory(userData) + end + populateSetsFrame() + setGui.SetPanel.CancelButton.MouseButton1Click:connect(function() + setGui.SetPanel.Visible = false + if dialogClosed ~= nil then + return dialogClosed() + end + return nil + end) + local setVisibilityFunction + setVisibilityFunction = function(visible) + setGui.SetPanel.Visible = not not visible + end + local getVisibilityFunction + getVisibilityFunction = function() + if (function() + if setGui ~= nil then + return setGui:FindFirstChild("SetPanel") + end + return nil + end)() then + return setGui.SetPanel.Visible + end + return false + end + return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent +end +t.CreateTerrainMaterialSelector = function(size, position) + local terrainMaterialSelectionChanged = Instance.new("BindableEvent") + terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" + local selectedButton + local frame = New("Frame", "TerrainMaterialSelector", { + Size = size or UDim2.new(0, 245, 0, 230), + BorderSizePixel = 0, + BackgroundColor3 = Color3.new(0, 0, 0), + Active = true + }) + if position then + frame.Position = position + end + terrainMaterialSelectionChanged.Parent = frame + local materialToImageMap = { } + local materialNames = { + "Grass", + "Sand", + "Brick", + "Granite", + "Asphalt", + "Iron", + "Aluminum", + "Gold", + "Plank", + "Log", + "Gravel", + "Cinder Block", + "Stone Wall", + "Concrete", + "Plastic (red)", + "Plastic (blue)", + "Water" + } + local currentMaterial = 1 + local getEnumFromName + getEnumFromName = function(choice) + for i, v in ipairs(materialNames) do + if v == choice then + return i + end + end + end + local getNameFromEnum + getNameFromEnum = function(choice) + if Enum.CellMaterial.Grass == choice or 1 == choice then + return "Grass" + elseif Enum.CellMaterial.Sand == choice or 2 == choice then + return "Sand" + elseif Enum.CellMaterial.Empty == choice or 0 == choice then + return "Erase" + elseif Enum.CellMaterial.Brick == choice or 3 == choice then + return "Brick" + elseif Enum.CellMaterial.Granite == choice or 4 == choice then + return "Granite" + elseif Enum.CellMaterial.Asphalt == choice or 5 == choice then + return "Asphalt" + elseif Enum.CellMaterial.Iron == choice or 6 == choice then + return "Iron" + elseif Enum.CellMaterial.Aluminum == choice or 7 == choice then + return "Aluminum" + elseif Enum.CellMaterial.Gold == choice or 8 == choice then + return "Gold" + elseif Enum.CellMaterial.WoodPlank == choice or 9 == choice then + return "Plank" + elseif Enum.CellMaterial.WoodLog == choice or 10 == choice then + return "Log" + elseif Enum.CellMaterial.Gravel == choice or 11 == choice then + return "Gravel" + elseif Enum.CellMaterial.CinderBlock == choice or 12 == choice then + return "Cinder Block" + elseif Enum.CellMaterial.MossyStone == choice or 13 == choice then + return "Stone Wall" + elseif Enum.CellMaterial.Cement == choice or 14 == choice then + return "Concrete" + elseif Enum.CellMaterial.RedPlastic == choice or 15 == choice then + return "Plastic (red)" + elseif Enum.CellMaterial.BluePlastic == choice or 16 == choice then + return "Plastic (blue)" + elseif Enum.CellMaterial.Water == choice or 17 == choice then + return "Water" + end + end + local updateMaterialChoice + updateMaterialChoice = function(choice) + currentMaterial = getEnumFromName(choice) + return terrainMaterialSelectionChanged:Fire(currentMaterial) + end + for _, v in pairs(materialNames) do + materialToImageMap[v] = { } + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=" .. tostring((function() + if "Grass" == v then + return 56563112 + elseif "Sand" == v then + return 62356652 + elseif "Brick" == v then + return 65961537 + elseif "Granite" == v then + return 67532153 + elseif "Asphalt" == v then + return 67532038 + elseif "Iron" == v then + return 67532093 + elseif "Aluminum" == v then + return 67531995 + elseif "Gold" == v then + return 67532118 + elseif "Plastic (red)" == v then + return 67531848 + elseif "Plastic (blue)" == v then + return 67531924 + elseif "Plank" == v then + return 67532015 + elseif "Log" == v then + return 67532051 + elseif "Gravel" == v then + return 67532206 + elseif "Cinder Block" == v then + return 67532103 + elseif "Stone Wall" == v then + return 67531804 + elseif "Concrete" == v then + return 67532059 + elseif "Water" == v then + return 81407474 + else + return 66887593 + end + end)()) + end + local scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame(nil, "grid") + scrollFrame.Size = UDim2.new(0.85, 0, 1, 0) + scrollFrame.Position = UDim2.new(0, 0, 0, 0) + scrollFrame.Parent = frame + scrollUp.Parent = frame + scrollUp.Visible = true + scrollUp.Position = UDim2.new(1, -19, 0, 0) + scrollDown.Parent = frame + scrollDown.Visible = true + scrollDown.Position = UDim2.new(1, -19, 1, -17) + local goToNewMaterial + goToNewMaterial = function(buttonWrap, materialName) + updateMaterialChoice(materialName) + buttonWrap.BackgroundTransparency = 0 + selectedButton.BackgroundTransparency = 1 + selectedButton = buttonWrap + end + local createMaterialButton + createMaterialButton = function(name) + local buttonWrap = New("TextButton", tostring(name), { + Text = "", + Size = UDim2.new(0, 32, 0, 32), + BackgroundColor3 = Color3.new(1, 1, 1), + BorderSizePixel = 0, + BackgroundTransparency = 1, + AutoButtonColor = false, + New("ImageButton", tostring(name), { + AutoButtonColor = false, + BackgroundTransparency = 1, + Size = UDim2.new(0, 30, 0, 30), + Position = UDim2.new(0, 1, 0, 1), + Image = materialToImageMap[name].Regular + }), + New("NumberValue", "EnumType", { + Value = 0 + }) + }) + do + local _with_0 = buttonWrap.ImageButton + _with_0.MouseEnter:connect(function() + buttonWrap.BackgroundTransparency = 0 + end) + _with_0.MouseLeave:connect(function() + if selectedButton ~= buttonWrap then + buttonWrap.BackgroundTransparency = 1 + end + end) + _with_0.MouseButton1Click:connect(function() + if selectedButton ~= buttonWrap then + return goToNewMaterial(buttonWrap, tostring(name)) + end + end) + end + return buttonWrap + end + for i = 1, #materialNames do + local imageButton = createMaterialButton(materialNames[i]) + if materialNames[i] == "Grass" then + selectedButton = imageButton + imageButton.BackgroundTransparency = 0 + end + imageButton.Parent = scrollFrame + end + local forceTerrainMaterialSelection + forceTerrainMaterialSelection = function(newMaterialType) + if not newMaterialType then + return + end + if currentMaterial == newMaterialType then + return + end + local matName = getNameFromEnum(newMaterialType) + local buttons = scrollFrame:GetChildren() + for i = 1, #buttons do + if (buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)") or (buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)") or (string.find(buttons[i].Name, matName)) then + goToNewMaterial(buttons[i], matName) + return + end + end + end + frame.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + return recalculateScroll() + end + end) + recalculateScroll() + return frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection +end +t.CreateLoadingFrame = function(name, size, position) + game:GetService("ContentProvider"):Preload("http://www.roblox.com/asset/?id=35238053") + local loadingFrame = New("Frame", "LoadingFrame", { + Style = Enum.FrameStyle.RobloxRound, + Size = size or UDim2.new(0, 300, 0, 160), + Position = position or UDim2.new(0.5, -150, 0.5, -80), + New("TextLabel", "loadingName", { + BackgroundTransparency = 1, + Size = UDim2.new(1, 0, 0, 18), + Position = UDim2.new(0, 0, 0, 2), + Font = Enum.Font.Arial, + Text = name, + TextColor3 = Color3.new(1, 1, 1), + TextStrokeTransparency = 1, + FontSize = Enum.FontSize.Size18 + }), + New("TextButton", "CancelButton", { + Position = UDim2.new(0.5, -60, 1, -40), + Size = UDim2.new(0, 120, 0, 40), + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + TextColor3 = Color3.new(1, 1, 1), + Text = "Cancel", + Style = Enum.ButtonStyle.RobloxButton + }), + New("Frame", "LoadingBar", { + BackgroundColor3 = Color3.new(0, 0, 0), + BorderColor3 = Color3.new(79 / 255, 79 / 255, 79 / 255), + Position = UDim2.new(0, 0, 0, 41), + Size = UDim2.new(1, 0, 0, 30), + New("ImageLabel", "LoadingGreenBar", { + Image = "http://www.roblox.com/asset/?id=35238053", + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(0, 0, 1, 0), + Visible = false + }), + New("TextLabel", "LoadingPercent", { + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 1, 0), + Size = UDim2.new(1, 0, 0, 14), + Font = Enum.Font.Arial, + Text = "0%", + FontSize = Enum.FontSize.Size14, + TextColor3 = Color3.new(1, 1, 1) + }) + }) + }) + local cancelButton, loadingGreenBar, loadingPercent = loadingFrame.CancelButton, loadingFrame.LoadingBar.LoadingGreenBar, loadingFrame.LoadingBar.LoadingPercent + local cancelButtonClicked = New("BindableEvent", "CancelButtonClicked", { + Parent = cancelButton + }) + cancelButton.MouseButton1Click:connect(function() + return cancelButtonClicked:Fire() + end) + local updateLoadingGuiPercent + updateLoadingGuiPercent = function(percent, tweenAction, tweenLength) + if percent and type(percent) ~= "number" then + error("updateLoadingGuiPercent expects number as argument, got", type(percent), "instead") + end + local newSize = UDim2.new((function() + if percent < 0 then + return 0, 0, 1, 0 + elseif percent > 1 then + return 1, 0, 1, 0 + else + return percent, 0, 1, 0 + end + end)()) + if tweenAction then + if not tweenLength then + error("updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument") + end + return loadingGreenBar:TweenSize(newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, (function() + if newSize.X.Scale > 0 then + loadingGreenBar.Visible = true + return true + else + return true, function() + if newSize.X.Scale < 0 then + loadingGreenBar.Visible = false + end + end + end + end)()) + else + loadingGreenBar.Size = newSize + loadingGreenBar.Visible = newSize.X.Scale > 0 + end + end + loadingGreenBar.Changed:connect(function(prop) + if prop == "Size" then + loadingPercent.Text = tostring(math.ceil(loadingGreenBar.Size.X.Scale * 100)) .. "%" + end + end) + return loadingFrame, updateLoadingGuiPercent, cancelButtonClicked +end +t.CreatePluginFrame = function(name, size, position, scrollable, parent) + local createMenuButton + createMenuButton = function(size, position, text, fontsize, name, parent) + local _with_0 = New("TextButton", name, { + AutoButtonColor = false, + BackgroundTransparency = 1, + Position = position, + Size = size, + Font = Enum.Font.ArialBold, + FontSize = fontsize, + Text = text, + TextColor3 = Color3.new(1, 1, 1), + BorderSizePixel = 0, + BackgroundColor3 = Color3.new(20 / 255, 20 / 255, 20 / 255) + }) + _with_0.MouseEnter:connect(function() + if _with_0.Selected then + return + end + _with_0.BackgroundTransparency = 0 + end) + _with_0.MouseLeave:connect(function() + if _with_0.Selected then + return + end + _with_0.BackgroundTransparency = 1 + end) + _with_0.Parent = parent + return _with_0 + end + local dragBar = New("Frame", tostring(name) .. "DragBar", { + BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255), + BorderColor3 = Color3.new(0, 0, 0), + Size = (function() + if size then + return UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + UDim2.new(0, 20, 0, 0) + else + return UDim2.new(0, 183, 0, 20) + end + end)(), + Active = true, + Draggable = true, + New("TextLabel", "BarNameLabel", { + Text = " " .. tostring(name), + TextColor3 = Color3.new(1, 1, 1), + TextStrokeTransparency = 0, + Size = UDim2.new(1, 0, 1, 0), + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size18, + TextXAlignment = Enum.TextXAlignment.Left, + BackgroundTransparency = 1 + }), + New("Frame", "HelpFrame", { + BackgroundColor3 = Color3.new(0, 0, 0), + Size = UDim2.new(0, 300, 0, 552), + Position = UDim2.new(1, 5, 0, 0), + Active = true, + BorderSizePixel = 0, + Visible = false + }), + New("Frame", "SeparatingLine", { + BackgroundColor3 = Color3.new(115 / 255, 115 / 255, 115 / 255), + BorderSizePixel = 0, + Position = UDim2.new(1, -18, 0.5, -7), + Size = UDim2.new(0, 1, 0, 14) + }), + New("Frame", "MinimizeFrame", { + BackgroundColor3 = Color3.new(73 / 255, 73 / 255, 73 / 255), + BorderColor3 = Color3.new(0, 0, 0), + Position = UDim2.new(0, 0, 1, 0), + Size = (function() + if size then + return UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + UDim2.new(0, 20, 0, 0) + else + return UDim2.new(0, 183, 0, 50) + end + end)(), + Visible = false, + New("TextButton", "MinimizeButton", { + Position = UDim2.new(0.5, -50, 0.5, -20), + Size = UDim2.new(0, 100, 0, 40), + Style = Enum.ButtonStyle.RobloxButton, + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size18, + TextColor3 = Color3.new(1, 1, 1), + Text = "Show" + }) + }) + }) + if position then + dragBar.Position = position + end + dragBar.MouseEnter:connect(function() + dragBar.BackgroundColor3 = Color3.new(49 / 255, 49 / 255, 49 / 255) + end) + dragBar.MouseLeave:connect(function() + dragBar.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255) + end) + dragBar.Parent = parent + local closeButton = createMenuButton(UDim2.new(0, 15, 0, 17), UDim2.new(1, -16, 0.5, -8), "X", Enum.FontSize.Size14, "CloseButton", dragBar) + local closeEvent = New("BindableEvent", "CloseEvent", { + Parent = closeButton + }) + closeButton.MouseButton1Click:connect(function() + closeEvent:Fire() + closeButton.BackgroundTransparency = 1 + end) + local helpButton = createMenuButton(UDim2.new(0, 15, 0, 17), UDim2.new(1, -51, 0.5, -8), "?", Enum.FontSize.Size14, "HelpButton", dragBar) + local helpFrame, separatingLine, minimizeFrame, minimizeBigButton = dragBar.HelpFrame, dragBar.SeparatingLine, dragBar.MinimizeFrame, dragBar.MinimizeFrame.MinimizeBigButton + helpButton.MouseButton1Click:connect(function() + helpFrame.Visible = not helpFrame.Visible + if helpFrame.Visible then + helpButton.Selected = true + helpButton.BackgroundTransparency = 0 + local screenGui = getScreenGuiAncestor(helpFrame) + if screenGui then + if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X then + helpFrame.Position = UDim2.new(0, -5 - helpFrame.AbsoluteSize.X, 0, 0) + else + helpFrame.Position = UDim2.new(1, 5, 0, 0) + end + else + helpFrame.Position = UDim2.new(1, 5, 0, 0) + end + else + helpButton.Selected = false + helpButton.BackgroundTransparency = 1 + end + end) + local minimizeButton = createMenuButton(UDim2.new(0, 16, 0, 17), UDim2.new(1, -34, 0.5, -8), "-", Enum.FontSize.Size14, "MinimizeButton", dragBar) + minimizeButton.TextYAlignment = Enum.TextYAlignment.Top + do + local _with_0 = separatingLine:clone() + _with_0.Position = UDim2.new(1, -35, 0.5, -7) + _with_0.Parent = dragBar + end + local widgetContainer = New("Frame", "WidgetContainer", { + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 1, 0), + BorderColor3 = Color3.new(0, 0, 0), + New("TextButton", "VerticalDragger", { + ZIndex = 2, + AutoButtonColor = false, + BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255), + BorderColor3 = Color3.new(0, 0, 0), + Size = UDim2.new(1, 20, 0, 20), + Position = UDim2.new(0, 0, 1, 0), + Active = true, + Text = "", + New("Frame", "ScrubFrame", { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderSizePixel = 0, + Position = UDim2.new(0.5, -5, 0.5, 0), + Size = UDim2.new(0, 10, 0, 1), + ZIndex = 5 + }) + }) + }) + local verticalDragger, scrubFrame = widgetContainer.VerticalDragger, widgetContainer.VerticalDragger.ScrubFrame + if not scrollable then + widgetContainer.BackgroundTransparency = 0 + widgetContainer.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) + end + widgetContainer.Parent = dragBar + if size then + if scrollable then + widgetContainer.Size = size + else + widgetContainer.Size = UDim2.new(0, dragBar.AbsoluteSize.X, size.Y.Scale, size.Y.Offset) + end + else + widgetContainer.Size = UDim2.new((function() + if scrollable then + return 0, 163, 0, 400 + else + return 0, dragBar.AbsoluteSize.X, 0, 400 + end + end)()) + end + if position then + widgetContainer.Position = position + UDim2.new(0, 0, 0, 20) + end + local frame, control + if scrollable then + frame, control = t.CreateTrueScrollingFrame() + frame.Size = UDim2.new(1, 0, 1, 0) + frame.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) + frame.BorderColor3 = Color3.new(0, 0, 0) + frame.Active = true + frame.Parent = widgetContainer + control.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) + control.BorderSizePixel = 0 + control.BackgroundTransparency = 0 + control.Position = UDim2.new(1, -21, 1, 1) + control.Size = UDim2.new(0, 21, (function() + if size then + return size.Y.Scale, size.Y.Offset + else + return 0, 400 + end + end)()) + control:FindFirstChild("ScrollDownButton").Position = UDim2.new(0, 0, 1, -20) + control.Parent = dragBar + New("Frame", "FakeLine", { + BorderSizePixel = 0, + BackgroundColor3 = Color3.new(0, 0, 0), + Size = UDim2.new(0, 1, 1, 1), + Position = UDim2.new(1, 0, 0, 0), + Parent = control + }) + for _ = 1, 2 do + do + local _with_0 = scrubFrame:clone() + _with_0.Position = UDim2.new(0.5, -5, 0.5, 2) + _with_0.Parent = verticalDragger + end + end + local areaSoak = New("TextButton", "AreaSoak", { + Size = UDim2.new(1, 0, 1, 0), + BackgroundTransparency = 1, + BorderSizePixel = 0, + Text = "", + ZIndex = 10, + Visible = false, + Active = true, + Parent = getScreenGuiAncestor(parent) + }) + local draggingVertical = false + local startYPos + verticalDragger.MouseEnter:connect(function() + verticalDragger.BackgroundColor3 = Color3.new(60 / 255, 60 / 255, 60 / 255) + end) + verticalDragger.MouseLeave:connect(function() + verticalDragger.BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255) + end) + verticalDragger.MouseButton1Down:connect(function(_, y) + draggingVertical = true + areaSoak.Visible = true + startYPos = y + end) + areaSoak.MouseButton1Up:connect(function() + draggingVertical = false + areaSoak.Visible = false + end) + areaSoak.MouseMoved:connect(function(_, y) + if not draggingVertical then + return + end + local yDelta = y - startYPos + if not control.ScrollDownButton.Visible and yDelta > 0 then + return + end + if (widgetContainer.Size.Y.Offset + yDelta) < 150 then + widgetContainer.Size = UDim2.new(widgetContainer.Size.X.Scale, widgetContainer.Size.X.Offset, widgetContainer.Size.Y.Scale, 150) + control.Size = UDim2.new(0, 21, 0, 150) + return + end + startYPos = y + if widgetContainer.Size.Y.Offset + yDelta >= 0 then + widgetContainer.Size = UDim2.new(widgetContainer.Size.X.Scale, widgetContainer.Size.X.Offset, widgetContainer.Size.Y.Scale, widgetContainer.Size.Y.Offset + yDelta) + control.Size = UDim2.new(0, 21, 0, control.Size.Y.Offset + yDelta) + end + end) + end + local switchMinimize + switchMinimize = function() + minimizeFrame.Visible = not minimizeFrame.Visible + if scrollable then + frame.Visible = not frame.Visible + verticalDragger.Visible = not verticalDragger.Visible + control.Visible = not control.Visible + else + widgetContainer.Visible = not widgetContainer.Visible + end + if minimizeFrame.Visible then + minimizeButton.Text = "+" + else + minimizeButton.Text = "-" + end + end + minimizeBigButton.MouseButton1Click:connect(switchMinimize) + minimizeButton.MouseButton1Click:connect(switchMinimize) + return dragBar, (function() + if scrollable then + return frame, helpFrame, closeEvent + else + return widgetContainer, helpFrame, closeEvent + end + end)() +end +t.Help = function(funcNameOrFunc) + if 'CreatePropertyDropDownMenu' == funcNameOrFunc or t.CreatePropertyDropDownMenu == funcNameOrFunc then + return 'Function CreatePropertyDropDownMenu. ' .. 'Arguments: (instance, propertyName, enumType). ' .. 'Side effect: returns a container with a drop-down-box that is linked to the "property" field of "instance" which is of type "enumType"' + elseif 'CreateDropDownMenu' == funcNameOrFunc or t.CreateDropDownMenu == funcNameOrFunc then + return 'Function CreateDropDownMenu. ' .. 'Arguments: (items, onItemSelected). ' .. 'Side effect: Returns 2 results, a container to the gui object and a "updateSelection" function for external updating. The container is a drop-down-box created around a list of items' + elseif 'CreateMessageDialog' == funcNameOrFunc or t.CreateMessageDialog == funcNameOrFunc then + return 'Function CreateMessageDialog. ' .. 'Arguments: (title, message, buttons). ' .. 'Side effect: Returns a gui object of a message box with "title" and "message" as passed in. "buttons" input is an array of Tables contains a "Text" and "Function" field for the text/callback of each button' + elseif 'CreateStyledMessageDialog' == funcNameOrFunc or t.CreateStyledMessageDialog == funcNameOrFunc then + return 'Function CreateStyledMessageDialog. ' .. 'Arguments: (title, message, style, buttons). ' .. 'Side effect: Returns a gui object of a message box with "title" and "message" as passed in. "buttons" input is an array of Tables contains a "Text" and "Function" field for the text/callback of each button, "style" is a string, either Error, Notify or Confirm' + elseif 'GetFontHeight' == funcNameOrFunc or t.GetFontHeight == funcNameOrFunc then + return 'Function GetFontHeight. ' .. 'Arguments: (font, fontSize). ' .. 'Side effect: returns the size in pixels of the given font + fontSize' + elseif 'CreateScrollingFrame' == funcNameOrFunc or t.CreateScrollingFrame == funcNameOrFunc then + return 'Function CreateScrollingFrame. ' .. 'Arguments: (orderList, style) ' .. 'Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). "scrollFrame" can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a "grid" styling if style is passed "grid" as a string. recalculateFunction can be called \n when a relayout is needed (\n when orderList changes)' + elseif 'CreateTrueScrollingFrame' == funcNameOrFunc or t.CreateTrueScrollingFrame == funcNameOrFunc then + return 'Function CreateTrueScrollingFrame. ' .. 'Arguments: (nil) ' .. 'Side effect: returns 2 objects, (scrollFrame, controlFrame). "scrollFrame" can be filled with GuiObjects, and they will be clipped if not inside the frame"s bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit.' + elseif 'AutoTruncateTextObject' == funcNameOrFunc or t.AutoTruncateTextObject == funcNameOrFunc then + return 'Function AutoTruncateTextObject. ' .. 'Arguments: (textLabel) ' .. 'Side effect: returns 2 objects, (textLabel, changeText). The "textLabel" input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. "changeText" is a function that can be used to change the text, it takes 1 string as an argument' + elseif 'CreateSlider' == funcNameOrFunc or t.CreateSlider == funcNameOrFunc then + return 'Function CreateSlider. ' .. 'Arguments: (steps, width, position) ' .. 'Side effect: returns 2 objects, (sliderGui, sliderPosition). The "steps" argument specifies how many different positions the slider can hold along the bar. "width" specifies in pixels how wide the bar should be (modifiable afterwards if desired). "position" argument should be a UDim2 for slider positioning. "sliderPosition" is an IntValue whose current .Value specifies the specific step the slider is currently on.' + elseif 'CreateLoadingFrame' == funcNameOrFunc or t.CreateLoadingFrame == funcNameOrFunc then + return 'Function CreateLoadingFrame. ' .. 'Arguments: (name, size, position) ' .. 'Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that \n when fired means that someone clicked the cancel button on the dialog.' + elseif 'CreateTerrainMaterialSelector' == funcNameOrFunc or t.CreateTerrainMaterialSelector == funcNameOrFunc then + return 'Function CreateTerrainMaterialSelector. ' .. 'Arguments: (size, position) ' .. 'Side effect: Size and position are UDim2 values that specifies the selector"s size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected.' + end +end diff --git a/yue/45284430.yue b/yue/45284430.yue index ce20fcb..36eb1f4 100644 --- a/yue/45284430.yue +++ b/yue/45284430.yue @@ -1,6 +1,3 @@ --- Rewriting one of the corescripts in Yuescript, --- a language similar to CoffeeScript that compiles to Lua. - t = {} -- Heliodex's basic New function (basically a simplified version of melt) @@ -36,14 +33,12 @@ ScopedConnect = (parentInstance, instance, event, signalFunc, syncFunc, removeFu --Entering the world, make sure we are connected/synced if not eventConnection eventConnection = instance[event]\connect signalFunc - if syncFunc - syncFunc! + syncFunc?! --Probably leaving the world, so disconnect for now if eventConnection eventConnection\disconnect! - if removeFunc - removeFunc! + removeFunc?! --Hook it up to ancestryChanged signal connection = parentInstance.AncestryChanged\connect tryConnect @@ -130,8 +125,7 @@ setSliderPos = (newAbsPosX, slider, sliderPosition, bar, steps) -> cancelSlide = (areaSoak) -> areaSoak.Visible = false - if areaSoakMouseMoveCon - areaSoakMouseMoveCon\disconnect! + areaSoakMouseMoveCon?\disconnect! t.CreateStyledMessageDialog = (title, message, style, buttons) -> frame = New "Frame", "MessageDialog" @@ -226,10 +220,27 @@ t.CreateDropDownMenu = (items, onSelect, forRoblox) -> width = UDim.new 0, 100 height = UDim.new 0, 32 + itemCount = dropDownItemCount = #items + useScrollButtons = false + if dropDownItemCount > 6 + useScrollButtons = true + dropDownItemCount = 6 + frame = New "Frame", "DropDownMenu" BackgroundTransparency: 1 Size: UDim2.new width, height + * New "TextButton", "List" + Text: "" + BackgroundTransparency: 1 + --AutoButtonColor: true + Style: Enum.ButtonStyle.RobloxButton + Visible: false + Active: true --Blocks clicks + Position: UDim2.new 0, 0, 0, 0 + Size: UDim2.new 1, 0, (1 + dropDownItemCount) * 0.8, 0 + ZIndex: 2 + * New "TextButton", "DropDownMenuButton" TextWrap: true TextColor3: Color3.new 1, 1, 1 @@ -252,26 +263,10 @@ t.CreateDropDownMenu = (items, onSelect, forRoblox) -> Position: UDim2.new 1, -11, 0.5, -2 ZIndex: 2 - dropDownMenu = frame.DropDownMenuButton - - itemCount = #items - dropDownItemCount = #items - useScrollButtons = false - if dropDownItemCount > 6 - useScrollButtons = true - dropDownItemCount = 6 - - droppedDownMenu = New "TextButton", "List" - Text: "" - BackgroundTransparency: 1 - --AutoButtonColor: true - Style: Enum.ButtonStyle.RobloxButton - Visible: false - Active: true --Blocks clicks - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, (1 + dropDownItemCount) * 0.8, 0 - Parent: frame - ZIndex: 2 + { -- Destructure + DropDownMenuButton: dropDownMenu + List: droppedDownMenu + } = frame choiceButton = New "TextButton", "ChoiceButton" BackgroundTransparency: 1 @@ -283,10 +278,10 @@ t.CreateDropDownMenu = (items, onSelect, forRoblox) -> BackgroundColor3: Color3.new 1, 1, 1 Font: Enum.Font.Arial FontSize: Enum.FontSize.Size18 - Size: if useScrollButtons - UDim2.new 1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 + Size: UDim2.new if useScrollButtons + 1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 else - UDim2.new 1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 + 1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 TextWrap: true ZIndex: 2 @@ -300,8 +295,7 @@ t.CreateDropDownMenu = (items, onSelect, forRoblox) -> dropDownSelected = false - local scrollUpButton - local scrollDownButton + local scrollUpButton, scrollDownButton scrollMouseCount = 0 setZIndex = (baseZIndex) -> @@ -315,7 +309,7 @@ t.CreateDropDownMenu = (items, onSelect, forRoblox) -> children = droppedDownMenu\GetChildren! if children - for _, child in ipairs(children) + for _, child in ipairs children if child.Name == "ChoiceButton" child.ZIndex = baseZIndex + 2 elseif child.Name == "ClickCaptureButton" @@ -333,7 +327,6 @@ t.CreateDropDownMenu = (items, onSelect, forRoblox) -> children = droppedDownMenu\GetChildren! return if not children - childNum = 1 for _, obj in ipairs(children) if obj.Name == "ChoiceButton" @@ -400,16 +393,14 @@ t.CreateDropDownMenu = (items, onSelect, forRoblox) -> scrollBarPosition += 1 updateScroll! return true - - return false + false scrollUp = -> if scrollBarPosition > 1 scrollBarPosition -= 1 updateScroll! return true - - return false + false if useScrollButtons --Make some scroll buttons @@ -510,7 +501,7 @@ t.CreatePropertyDropDownMenu = (instance, property, enum) -> names[i] = obj.Name nameToItem[obj.Name] = obj - local frame, updateSelection = t.CreateDropDownMenu names, (text) -> + frame, updateSelection = t.CreateDropDownMenu names, (text) -> instance[property] = nameToItem[text] t1 = (prop) -> @@ -558,8 +549,8 @@ t.GetFontHeight = (font, fontSize) -> else error "Unknown Font #{font}" layoutGuiObjectsHelper = (frame, guiObjects, settingsTable) -> - totalPixels = frame.AbsoluteSize.Y - pixelsRemaining = frame.AbsoluteSize.Y + totalPixels = pixelsRemaining = frame.AbsoluteSize.Y + for _, child in ipairs guiObjects if child\IsA "TextLabel" or child\IsA "TextButton" isLabel = child\IsA "TextLabel" @@ -676,12 +667,12 @@ t.CreateSlider = (steps, width, position) -> Visible: false ZIndex: 4 - { -- Deconstruct - SliderPosition: sliderPosition, - SliderSteps: sliderSteps, - Bar: + { -- Destructure + Bar: Slider: slider Bar: bar + SliderPosition: sliderPosition + SliderSteps: sliderSteps } = sliderGui sliderGui.AncestryChanged\connect (_, parent) -> @@ -711,8 +702,7 @@ t.CreateSlider = (steps, width, position) -> slider.MouseButton1Down\connect -> areaSoak.Visible = true - if areaSoakMouseMoveCon - areaSoakMouseMoveCon\disconnect! + areaSoakMouseMoveCon?\disconnect! areaSoakMouseMoveCon = areaSoak.MouseMoved\connect (x, _) -> setSliderPos x, slider, sliderPosition, bar, steps @@ -735,12 +725,12 @@ t.CreateTrueScrollingFrame = -> local dragCon, upCon internalChange = false - descendantsChangeConMap = {} + desantsChangeConMap = {} scrollingFrame = New "Frame", "ScrollingFrame" Active: true Size: UDim2.new 1, 0, 1, 0 - ClipsDescendants: true + ClipsDesants: true * New "Frame", "ControlFrame" BackgroundTransparency: 1 @@ -785,9 +775,9 @@ t.CreateTrueScrollingFrame = -> ZIndex: 2 BackgroundTransparency: 0.5 - { -- Deconstruct + { -- Destructure ControlFrame: controlFrame - ControlFrame: + ControlFrame: ScrollBottom: scrollBottom ScrollUp: scrollUp ScrollUpButton: scrollUpButton @@ -896,7 +886,7 @@ t.CreateTrueScrollingFrame = -> else scrollUp.Value = false scrollBottom.Value = false - + scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, newScaleYPos, 0 return (oldPos ~= scrollbar.Position) @@ -904,7 +894,7 @@ t.CreateTrueScrollingFrame = -> drillDownSetHighLow = (instance) -> return if not instance or not instance\IsA "GuiObject" return if instance == controlFrame - return if instance\IsDescendantOf controlFrame + return if instance\IsDesantOf controlFrame return if not instance.Visible if (lowY and lowY > instance.AbsolutePosition.Y) or not lowY @@ -917,7 +907,6 @@ t.CreateTrueScrollingFrame = -> for i = 1, #children drillDownSetHighLow children[i] - resetHighLow = -> firstChildren = scrollingFrame\GetChildren! @@ -930,7 +919,7 @@ t.CreateTrueScrollingFrame = -> percentFrame = 0 if scrollbar.Position.Y.Scale > 0 if scrollbar.Visible - percentFrame = scrollbar.Position.Y.Scale / + percentFrame = scrollbar.Position.Y.Scale / ((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) / scrollTrack.AbsoluteSize.Y) else percentFrame = 0 @@ -955,7 +944,6 @@ t.CreateTrueScrollingFrame = -> resetHighLow! internalChange = false - setSliderSizeAndPosition = -> return if not highY or not lowY @@ -965,15 +953,11 @@ t.CreateTrueScrollingFrame = -> scrollDownButton.Visible = false scrollUpButton.Visible = false - if dragCon - dragCon\disconnect! - dragCon = nil + dragCon?\disconnect! + dragCon = nil - if upCon - upCon\disconnect! - upCon = nil - - return + upCon?\disconnect! + upCon = nil percentShown = scrollingFrame.AbsoluteSize.Y / totalYSpan if percentShown >= 1 @@ -999,8 +983,8 @@ t.CreateTrueScrollingFrame = -> if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0 - if (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) > - (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) + if scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y > + scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0 @@ -1064,7 +1048,7 @@ t.CreateTrueScrollingFrame = -> mouseDrag.Parent = nil downCon\disconnect! - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + mouseDrag.Parent = getScreenGuiAncestor scrollbar doScrollDown! wait 0.2 t = tick! @@ -1081,24 +1065,24 @@ t.CreateTrueScrollingFrame = -> wait w - scrollbar.MouseButton1Down\connect (x, y) -> + global scrollStamp + scrollbar.MouseButton1Down\connect (_, y) -> if scrollbar.Active scrollStamp = tick! mouseOffset = y - scrollbar.AbsolutePosition.y - if dragCon - dragCon\disconnect! - dragCon = nil - if upCon - upCon\disconnect! - upCon = nil + dragCon?\disconnect! + dragCon = nil + + upCon?\disconnect! + upCon = nil reentrancyGuardMouseScroll = false dragCon = mouseDrag.MouseMoved\connect (x, y) -> return if reentrancyGuardMouseScroll reentrancyGuardMouseScroll = true - if positionScrollBar(x, y, mouseOffset) + if positionScrollBar x, y, mouseOffset recalculate! reentrancyGuardMouseScroll = false @@ -1111,7 +1095,7 @@ t.CreateTrueScrollingFrame = -> upCon\disconnect! drag = nil - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + mouseDrag.Parent = getScreenGuiAncestor scrollbar scrollMouseCount = 0 @@ -1122,7 +1106,7 @@ t.CreateTrueScrollingFrame = -> scrollDown! scrollTick = -> - global scrollStamp = tick! + scrollStamp = tick! scrollUpButton.MouseButton1Up\connect scrollTick scrollDownButton.MouseButton1Up\connect scrollTick @@ -1144,7 +1128,7 @@ t.CreateTrueScrollingFrame = -> if (lowY ~= oldLowY) or (highY ~= oldHighY) setSliderSizeAndPosition! - descendantChanged = (this, prop) -> + desantChanged = (this, prop) -> return if internalChange return if not this.Visible @@ -1152,22 +1136,22 @@ t.CreateTrueScrollingFrame = -> wait! highLowRecheck! - scrollingFrame.DescendantAdded\connect (instance) -> + scrollingFrame.DesantAdded\connect (instance) -> return if not instance\IsA "GuiObject" if instance.Visible wait! -- wait a heartbeat for sizes to reconfig highLowRecheck! - descendantsChangeConMap[instance] = instance.Changed\connect (prop) -> - descendantChanged(instance, prop) + desantsChangeConMap[instance] = instance.Changed\connect (prop) -> + desantChanged instance, prop - scrollingFrame.DescendantRemoving\connect (instance) -> + scrollingFrame.DesantRemoving\connect (instance) -> return if not instance\IsA "GuiObject" - if descendantsChangeConMap[instance] - descendantsChangeConMap[instance]\disconnect! - descendantsChangeConMap[instance] = nil + if desantsChangeConMap[instance] + desantsChangeConMap[instance]\disconnect! + desantsChangeConMap[instance] = nil wait! -- wait a heartbeat for sizes to reconfig highLowRecheck! @@ -1181,4007 +1165,2263 @@ t.CreateTrueScrollingFrame = -> scrollingFrame, controlFrame --- TODO - ---[[original lua script - t = {} - - ScopedConnect = (parentInstance, instance, event, signalFunc, syncFunc, removeFunc) - eventConnection = nil - - --Connection on parentInstance is scoped by parentInstance (when destroyed, it goes away) - tryConnect = function() - if game:IsAncestorOf(parentInstance) - --Entering the world, make sure we are connected/synced - if not eventConnection - eventConnection = instance[event]\connect(signalFunc) - if syncFunc - syncFunc() - - - else - --Probably leaving the world, so disconnect for now - if eventConnection - eventConnection\disconnect! - if removeFunc - removeFunc() - - - --Hook it up to ancestryChanged signal - connection = parentInstance.AncestryChanged\connect(tryConnect) - - --Now connect us if we're already in the world - tryConnect() - - return connection - end - - getScreenGuiAncestor = (instance) - localInstance = instance - while localInstance and not localInstance\IsA "ScreenGui" - localInstance = localInstance.Parent - return localInstance - end - - CreateButtons = (frame, buttons, yPos, ySize) - buttonNum = 1 - buttonObjs = {} - for _, obj in ipairs(buttons) - button = Instance.new "TextButton" - button.Name = "Button" .. buttonNum - button.Font = Enum.Font.Arial - button.FontSize = Enum.FontSize.Size18 - button.AutoButtonColor = true - button.Modal = true - if obj["Style"] - button.Style = obj.Style - else - button.Style = Enum.ButtonStyle.RobloxButton - - button.Text = obj.Text - button.TextColor3 = Color3.new 1, 1, 1 - button.MouseButton1Click\connect(obj.Function) - button.Parent = frame - buttonObjs[buttonNum] = button - - buttonNum += 1 - numButtons = buttonNum - 1 - - if numButtons == 1 - frame.Button1.Position = UDim2.new 0.35, 0, yPos.Scale, yPos.Offset) - frame.Button1.Size = UDim2.new 0.4, 0, ySize.Scale, ySize.Offset) - elseif numButtons == 2 - frame.Button1.Position = UDim2.new 0.1, 0, yPos.Scale, yPos.Offset) - frame.Button1.Size = UDim2.new 0.8 / 3, 0, ySize.Scale, ySize.Offset) - - frame.Button2.Position = UDim2.new 0.55, 0, yPos.Scale, yPos.Offset) - frame.Button2.Size = UDim2.new 0.35, 0, ySize.Scale, ySize.Offset) - elseif numButtons >= 3 - spacing = 0.1 / numButtons - buttonSize = 0.9 / numButtons - - buttonNum = 1 - while buttonNum <= numButtons - buttonObjs[buttonNum].Position = - UDim2.new(spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, yPos.Scale, yPos.Offset) - buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) - buttonNum += 1 - - end - - setSliderPos = (newAbsPosX, slider, sliderPosition, bar, steps) - newStep = steps - 1 --otherwise we really get one more step than we want - relativePosX = math.min(1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X)) - local wholeNum, remainder = math.modf(relativePosX * newStep) - if remainder > 0.5 - wholeNum += 1 - relativePosX = wholeNum / newStep - - result = math.ceil(relativePosX * newStep) - if sliderPosition.Value ~= (result + 1) then --only update if we moved a step - sliderPosition.Value = result + 1 - slider.Position = - UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset) - end - - cancelSlide = areaSoak - areaSoak.Visible = false - if areaSoakMouseMoveCon - areaSoakMouseMoveCon\disconnect! - end - - t.CreateStyledMessageDialog = function(title, message, style, buttons) - frame = Instance.new "Frame" - frame.Size = UDim2.new 0.5, 0, 0, 165) - frame.Position = UDim2.new 0.25, 0, 0.5, -72.5) - frame.Name = "MessageDialog" - frame.Active = true - frame.Style = Enum.FrameStyle.RobloxRound - - styleImage = Instance.new "ImageLabel" - styleImage.Name = "StyleImage" - styleImage.BackgroundTransparency = 1 - styleImage.Position = UDim2.new 0, 5, 0, 15) - if style == "error" or style == "Error" - styleImage.Size = UDim2.new 0, 71, 0, 71) - styleImage.Image = "http://www.roblox.com/asset?id=42565285" - elseif style == "notify" or style == "Notify" - styleImage.Size = UDim2.new 0, 71, 0, 71) - styleImage.Image = "http://www.roblox.com/asset?id=42604978" - elseif style == "confirm" or style == "Confirm" - styleImage.Size = UDim2.new 0, 74, 0, 76) - styleImage.Image = "http://www.roblox.com/asset?id=42557901" - else - return t.CreateMessageDialog(title, message, buttons) - styleImage.Parent = frame - - titleLabel = Instance.new "TextLabel" - titleLabel.Name = "Title" - titleLabel.Text = title - titleLabel.TextStrokeTransparency = 0 - titleLabel.BackgroundTransparency = 1 - titleLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) - titleLabel.Position = UDim2.new 0, 80, 0, 0) - titleLabel.Size = UDim2.new(1, -80, 0, 40) - titleLabel.Font = Enum.Font.ArialBold - titleLabel.FontSize = Enum.FontSize.Size36 - titleLabel.TextXAlignment = Enum.TextXAlignment.Center - titleLabel.TextYAlignment = Enum.TextYAlignment.Center - titleLabel.Parent = frame - - messageLabel = Instance.new "TextLabel" - messageLabel.Name = "Message" - messageLabel.Text = message - messageLabel.TextStrokeTransparency = 0 - messageLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) - messageLabel.Position = UDim2.new 0.025, 80, 0, 45) - messageLabel.Size = UDim2.new 0.95, -80, 0, 55) - messageLabel.BackgroundTransparency = 1 - messageLabel.Font = Enum.Font.Arial - messageLabel.FontSize = Enum.FontSize.Size18 - messageLabel.TextWrap = true - messageLabel.TextXAlignment = Enum.TextXAlignment.Left - messageLabel.TextYAlignment = Enum.TextYAlignment.Top - messageLabel.Parent = frame - - CreateButtons(frame, buttons, UDim.new(0, 105), UDim.new(0, 40)) - - return frame - end - - t.CreateMessageDialog = function(title, message, buttons) - frame = Instance.new "Frame" - frame.Size = UDim2.new 0.5, 0, 0.5, 0) - frame.Position = UDim2.new 0.25, 0, 0.25, 0) - frame.Name = "MessageDialog" - frame.Active = true - frame.Style = Enum.FrameStyle.RobloxRound - - titleLabel = Instance.new "TextLabel" - titleLabel.Name = "Title" - titleLabel.Text = title - titleLabel.BackgroundTransparency = 1 - titleLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) - titleLabel.Position = UDim2.new 0, 0, 0, 0) - titleLabel.Size = UDim2.new(1, 0, 0.15, 0) - titleLabel.Font = Enum.Font.ArialBold - titleLabel.FontSize = Enum.FontSize.Size36 - titleLabel.TextXAlignment = Enum.TextXAlignment.Center - titleLabel.TextYAlignment = Enum.TextYAlignment.Center - titleLabel.Parent = frame - - messageLabel = Instance.new "TextLabel" - messageLabel.Name = "Message" - messageLabel.Text = message - messageLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) - messageLabel.Position = UDim2.new 0.025, 0, 0.175, 0) - messageLabel.Size = UDim2.new 0.95, 0, 0.55, 0) - messageLabel.BackgroundTransparency = 1 - messageLabel.Font = Enum.Font.Arial - messageLabel.FontSize = Enum.FontSize.Size18 - messageLabel.TextWrap = true - messageLabel.TextXAlignment = Enum.TextXAlignment.Left - messageLabel.TextYAlignment = Enum.TextYAlignment.Top - messageLabel.Parent = frame - - CreateButtons(frame, buttons, UDim.new(0.8, 0), UDim.new(0.15, 0)) - - return frame - end - - t.CreateDropDownMenu = function(items, onSelect, forRoblox) - width = UDim.new(0, 100) - height = UDim.new(0, 32) - - frame = Instance.new "Frame" - frame.Name = "DropDownMenu" - frame.BackgroundTransparency = 1 - frame.Size = UDim2.new(width, height) - - dropDownMenu = Instance.new "TextButton" - dropDownMenu.Name = "DropDownMenuButton" - dropDownMenu.TextWrap = true - dropDownMenu.TextColor3 = Color3.new 1, 1, 1 - dropDownMenu.Text = "Choose One" - dropDownMenu.Font = Enum.Font.ArialBold - dropDownMenu.FontSize = Enum.FontSize.Size18 - dropDownMenu.TextXAlignment = Enum.TextXAlignment.Left - dropDownMenu.TextYAlignment = Enum.TextYAlignment.Center - dropDownMenu.BackgroundTransparency = 1 - dropDownMenu.AutoButtonColor = true - dropDownMenu.Style = Enum.ButtonStyle.RobloxButton - dropDownMenu.Size = UDim2.new(1, 0, 1, 0) - dropDownMenu.Parent = frame - dropDownMenu.ZIndex = 2 - - dropDownIcon = Instance.new "ImageLabel" - dropDownIcon.Name = "Icon" - dropDownIcon.Active = false - dropDownIcon.Image = "http://www.roblox.com/asset/?id=45732894" - dropDownIcon.BackgroundTransparency = 1 - dropDownIcon.Size = UDim2.new 0, 11, 0, 6) - dropDownIcon.Position = UDim2.new(1, -11, 0.5, -2) - dropDownIcon.Parent = dropDownMenu - dropDownIcon.ZIndex = 2 - - itemCount = #items - dropDownItemCount = #items - useScrollButtons = false - if dropDownItemCount > 6 - useScrollButtons = true - dropDownItemCount = 6 - - droppedDownMenu = Instance.new "TextButton" - droppedDownMenu.Name = "List" - droppedDownMenu.Text = "" - droppedDownMenu.BackgroundTransparency = 1 - --droppedDownMenu.AutoButtonColor = true - droppedDownMenu.Style = Enum.ButtonStyle.RobloxButton - droppedDownMenu.Visible = false - droppedDownMenu.Active = true --Blocks clicks - droppedDownMenu.Position = UDim2.new 0, 0, 0, 0) - droppedDownMenu.Size = UDim2.new(1, 0, (1 + dropDownItemCount) * 0.8, 0) - droppedDownMenu.Parent = frame - droppedDownMenu.ZIndex = 2 - - choiceButton = Instance.new "TextButton" - choiceButton.Name = "ChoiceButton" - choiceButton.BackgroundTransparency = 1 - choiceButton.BorderSizePixel = 0 - choiceButton.Text = "ReplaceMe" - choiceButton.TextColor3 = Color3.new 1, 1, 1 - choiceButton.TextXAlignment = Enum.TextXAlignment.Left - choiceButton.TextYAlignment = Enum.TextYAlignment.Center - choiceButton.BackgroundColor3 = Color3.new 1, 1, 1 - choiceButton.Font = Enum.Font.Arial - choiceButton.FontSize = Enum.FontSize.Size18 - if useScrollButtons - choiceButton.Size = UDim2.new(1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) - else - choiceButton.Size = UDim2.new(1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) - choiceButton.TextWrap = true - choiceButton.ZIndex = 2 - - areaSoak = Instance.new "TextButton" - areaSoak.Name = "AreaSoak" - areaSoak.Text = "" - areaSoak.BackgroundTransparency = 1 - areaSoak.Active = true - areaSoak.Size = UDim2.new(1, 0, 1, 0) - areaSoak.Visible = false - areaSoak.ZIndex = 3 - - dropDownSelected = false - - local scrollUpButton - local scrollDownButton - scrollMouseCount = 0 - - setZIndex = function(baseZIndex) - droppedDownMenu.ZIndex = baseZIndex + 1 - if scrollUpButton - scrollUpButton.ZIndex = baseZIndex + 3 - - if scrollDownButton - scrollDownButton.ZIndex = baseZIndex + 3 - - - children = droppedDownMenu\GetChildren! - if children - for _, child in ipairs(children) - if child.Name == "ChoiceButton" - child.ZIndex = baseZIndex + 2 - elseif child.Name == "ClickCaptureButton" - child.ZIndex = baseZIndex - - - - - scrollBarPosition = 1 - updateScroll = function() - if scrollUpButton - scrollUpButton.Active = scrollBarPosition > 1 - - if scrollDownButton - scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount - - - children = droppedDownMenu\GetChildren! - if not children - return - - - childNum = 1 - for _, obj in ipairs(children) - if obj.Name == "ChoiceButton" - if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount - obj.Visible = false - else - obj.Position = - UDim2.new 0, 0, ((childNum - scrollBarPosition + 1) * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) - obj.Visible = true - - obj.TextColor3 = Color3.new 1, 1, 1 - obj.BackgroundTransparency = 1 - - childNum += 1 - - - toggleVisibility = function() - dropDownSelected = not dropDownSelected - - areaSoak.Visible = not areaSoak.Visible - dropDownMenu.Visible = not dropDownSelected - droppedDownMenu.Visible = dropDownSelected - if dropDownSelected - setZIndex(4) - else - setZIndex(2) - - if useScrollButtons - updateScroll! - - droppedDownMenu.MouseButton1Click\connect(toggleVisibility) - - updateSelection = function(text) - foundItem = false - children = droppedDownMenu\GetChildren! - childNum = 1 - if children - for _, obj in ipairs(children) - if obj.Name == "ChoiceButton" - if obj.Text == text - obj.Font = Enum.Font.ArialBold - foundItem = true - scrollBarPosition = childNum - else - obj.Font = Enum.Font.Arial - - childNum += 1 - - - - if not text - dropDownMenu.Text = "Choose One" - scrollBarPosition = 1 - else - if not foundItem - error("Invalid Selection Update -- " .. text) - - - if scrollBarPosition + dropDownItemCount > itemCount + 1 - scrollBarPosition = itemCount - dropDownItemCount + 1 - - - dropDownMenu.Text = text - - - scrollDown = ! - if scrollBarPosition + dropDownItemCount <= itemCount - scrollBarPosition += 1 - updateScroll! - return true - - return false - scrollUp = ! - if scrollBarPosition > 1 - scrollBarPosition -= 1 - updateScroll! - return true - - return false - - if useScrollButtons - --Make some scroll buttons - scrollUpButton = Instance.new "ImageButton" - scrollUpButton.Name = "ScrollUpButton" - scrollUpButton.BackgroundTransparency = 1 - scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" - scrollUpButton.Size = UDim2.new 0, 17, 0, 17) - scrollUpButton.Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) - scrollUpButton.MouseButton1Click\connect -> - scrollMouseCount += 1 - - scrollUpButton.MouseLeave\connect -> - scrollMouseCount += 1 -) - scrollUpButton.MouseButton1Down\connect -> - scrollMouseCount += 1 - - scrollUp! - val = scrollMouseCount - wait 0.5 - while val == scrollMouseCount - if scrollUp! == false - break - - wait 0.1 - -) - - scrollUpButton.Parent = droppedDownMenu - - scrollDownButton = Instance.new "ImageButton" - scrollDownButton.Name = "ScrollDownButton" - scrollDownButton.BackgroundTransparency = 1 - scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" - scrollDownButton.Size = UDim2.new 0, 17, 0, 17) - scrollDownButton.Position = UDim2.new(1, -11, 1, -11) - scrollDownButton.Parent = droppedDownMenu - scrollDownButton.MouseButton1Click\connect -> - scrollMouseCount += 1 -) - scrollDownButton.MouseLeave\connect -> - scrollMouseCount += 1 -) - scrollDownButton.MouseButton1Down\connect -> - scrollMouseCount += 1 - - scrollDown! - val = scrollMouseCount - wait 0.5 - while val == scrollMouseCount - if scrollDown! == false - break - - wait 0.1 - -) - - scrollbar = Instance.new "ImageLabel" - scrollbar.Name = "ScrollBar" - scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" - scrollbar.BackgroundTransparency = 1 - scrollbar.Size = UDim2.new 0, 18, (dropDownItemCount * 0.8) / ((dropDownItemCount + 1) * 0.8), -17 - 11 - 4) - scrollbar.Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 17 + 2) - scrollbar.Parent = droppedDownMenu - - for _, item in ipairs(items) - -- needed to maintain local scope for items in event listeners below - button = choiceButton\clone! - if forRoblox - button.RobloxLocked = true - - button.Text = item - button.Parent = droppedDownMenu - button.MouseButton1Click\connect -> - --Remove Highlight - button.TextColor3 = Color3.new 1, 1, 1 - button.BackgroundTransparency = 1 - - updateSelection item - onSelect item - - toggleVisibility! -) - button.MouseEnter\connect -> - --Add Highlight - button.TextColor3 = Color3.new 0, 0, 0 - button.BackgroundTransparency = 0 -) - - button.MouseLeave\connect -> - --Remove Highlight - button.TextColor3 = Color3.new 1, 1, 1 - button.BackgroundTransparency = 1 -) - - --This does the initial layout of the buttons - updateScroll! - - frame.AncestryChanged\connect(function(_, parent) - if parent == nil - areaSoak.Parent = nil - else - areaSoak.Parent = getScreenGuiAncestor(frame) - - - - dropDownMenu.MouseButton1Click\connect(toggleVisibility) - areaSoak.MouseButton1Click\connect(toggleVisibility) - return frame, updateSelection - end - - t.CreatePropertyDropDownMenu = function(instance, property, enum) - items = enum\GetEnumItems! - names = {} - nameToItem = {} - for i, obj in ipairs(items) - names[i] = obj.Name - nameToItem[obj.Name] = obj - - local frame - local updateSelection - frame, updateSelection = t.CreateDropDownMenu(names, function(text) - instance[property] = nameToItem[text] - - - ScopedConnect(frame, instance, "Changed", (prop) -> - if prop == property - updateSelection(instance[property].Name) -, function() - updateSelection(instance[property].Name) - - - return frame - end - - t.GetFontHeight = function(font, fontSize) - if font == nil or fontSize == nil - error "Font and FontSize must be non-nil" - - if font == Enum.Font.Legacy - if fontSize == Enum.FontSize.Size8 - return 12 - elseif fontSize == Enum.FontSize.Size9 - return 14 - elseif fontSize == Enum.FontSize.Size10 - return 15 - elseif fontSize == Enum.FontSize.Size11 - return 17 - elseif fontSize == Enum.FontSize.Size12 - return 18 - elseif fontSize == Enum.FontSize.Size14 - return 21 - elseif fontSize == Enum.FontSize.Size18 - return 27 - elseif fontSize == Enum.FontSize.Size24 - return 36 - elseif fontSize == Enum.FontSize.Size36 - return 54 - elseif fontSize == Enum.FontSize.Size48 - return 72 - else - error "Unknown FontSize" - - elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold - if fontSize == Enum.FontSize.Size8 - return 8 - elseif fontSize == Enum.FontSize.Size9 - return 9 - elseif fontSize == Enum.FontSize.Size10 - return 10 - elseif fontSize == Enum.FontSize.Size11 - return 11 - elseif fontSize == Enum.FontSize.Size12 - return 12 - elseif fontSize == Enum.FontSize.Size14 - return 14 - elseif fontSize == Enum.FontSize.Size18 - return 18 - elseif fontSize == Enum.FontSize.Size24 - return 24 - elseif fontSize == Enum.FontSize.Size36 - return 36 - elseif fontSize == Enum.FontSize.Size48 - return 48 - else - error "Unknown FontSize" - - else - error("Unknown Font " .. font) - end - - layoutGuiObjectsHelper = (frame, guiObjects, settingsTable) - totalPixels = frame.AbsoluteSize.Y - pixelsRemaining = frame.AbsoluteSize.Y - for _, child in ipairs(guiObjects) - if child\IsA "TextLabel" or child\IsA "TextButton" - isLabel = child\IsA "TextLabel" - if isLabel - pixelsRemaining -= settingsTable["TextLabelPositionPadY"] - else - pixelsRemaining -= settingsTable["TextButtonPositionPadY"] - - child.Position = - UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining) - - if child.TextFits and child.TextBounds.Y < pixelsRemaining - child.Visible = true - if isLabel - child.Size = UDim2.new( - child.Size.X.Scale, - child.Size.X.Offset, - 0, - child.TextBounds.Y + settingsTable["TextLabelSizePadY"] - ) - else - child.Size = UDim2.new( - child.Size.X.Scale, - child.Size.X.Offset, - 0, - child.TextBounds.Y + settingsTable["TextButtonSizePadY"] - ) - - - until child.TextFits - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1) - - pixelsRemaining -= child.AbsoluteSize.Y - - if isLabel - pixelsRemaining -= settingsTable["TextLabelPositionPadY"] - else - pixelsRemaining -= settingsTable["TextButtonPositionPadY"] - - else - child.Visible = false - pixelsRemaining = -1 - - else - --GuiObject - child.Position = - UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) - pixelsRemaining -= child.AbsoluteSize.Y - child.Visible = (pixelsRemaining >= 0) - - end - - t.LayoutGuiObjects = function(frame, guiObjects, settingsTable) - if not frame\IsA "GuiObject" - error "Frame must be a GuiObject" - for _, child in ipairs(guiObjects) - if not child\IsA "GuiObject" - error "All elements that are layed out must be of type GuiObject" - - - if not settingsTable - settingsTable = {} - - if not settingsTable["TextLabelSizePadY"] - settingsTable["TextLabelSizePadY"] = 0 - if not settingsTable["TextLabelPositionPadY"] - settingsTable["TextLabelPositionPadY"] = 0 - if not settingsTable["TextButtonSizePadY"] - settingsTable["TextButtonSizePadY"] = 12 - if not settingsTable["TextButtonPositionPadY"] - settingsTable["TextButtonPositionPadY"] = 2 - - --Wrapper frame takes care of styled objects - wrapperFrame = Instance.new "Frame" - wrapperFrame.Name = "WrapperFrame" - wrapperFrame.BackgroundTransparency = 1 - wrapperFrame.Size = UDim2.new(1, 0, 1, 0) - wrapperFrame.Parent = frame - - for _, child in ipairs(guiObjects) - child.Parent = wrapperFrame - - recalculate = function() - wait! - layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) - - frame.Changed\connect((p ->rop) - if prop == "AbsoluteSize" - --Wait a heartbeat for it to sync in - recalculate(nil) - - - frame.AncestryChanged\connect(recalculate) - - layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) - end - - t.CreateSlider = function(steps, width, position) - sliderGui = Instance.new "Frame" - sliderGui.Size = UDim2.new(1, 0, 1, 0) - sliderGui.BackgroundTransparency = 1 - sliderGui.Name = "SliderGui" - - sliderSteps = Instance.new "IntValue" - sliderSteps.Name = "SliderSteps" - sliderSteps.Value = steps - sliderSteps.Parent = sliderGui - - areaSoak = Instance.new "TextButton" - areaSoak.Name = "AreaSoak" - areaSoak.Text = "" - areaSoak.BackgroundTransparency = 1 - areaSoak.Active = false - areaSoak.Size = UDim2.new(1, 0, 1, 0) - areaSoak.Visible = false - areaSoak.ZIndex = 4 - - sliderGui.AncestryChanged\connect(function(_, parent) - if parent == nil - areaSoak.Parent = nil - else - areaSoak.Parent = getScreenGuiAncestor(sliderGui) - - - - sliderPosition = Instance.new "IntValue" - sliderPosition.Name = "SliderPosition" - sliderPosition.Value = 0 - sliderPosition.Parent = sliderGui - - bar = Instance.new "TextButton" - bar.Text = "" - bar.AutoButtonColor = false - bar.Name = "Bar" - bar.BackgroundColor3 = Color3.new 0, 0, 0 - if type(width) == "number" - bar.Size = UDim2.new 0, width, 0, 5) - else - bar.Size = UDim2.new 0, 200, 0, 5) - bar.BorderColor3 = Color3.new(95 / 255, 95 / 255, 95 / 255) - bar.ZIndex = 2 - bar.Parent = sliderGui - - if - position["X"] - and position["X"]["Scale"] - and position["X"]["Offset"] - and position["Y"] - and position["Y"]["Scale"] - and position["Y"]["Offset"] - then - bar.Position = position - - slider = Instance.new "ImageButton" - slider.Name = "Slider" - slider.BackgroundTransparency = 1 - slider.Image = "rbxasset://textures/ui/Slider.png" - slider.Position = UDim2.new 0, 0, 0.5, -10) - slider.Size = UDim2.new 0, 20, 0, 20) - slider.ZIndex = 3 - slider.Parent = bar - - areaSoakMouseMoveCon = nil - - areaSoak.MouseLeave\connect -> - if areaSoak.Visible - cancelSlide areaSoak - - - areaSoak.MouseButton1Up\connect -> - if areaSoak.Visible - cancelSlide areaSoak - - - - slider.MouseButton1Down\connect -> - areaSoak.Visible = true - if areaSoakMouseMoveCon - areaSoakMouseMoveCon\disconnect! - - areaSoakMouseMoveCon = areaSoak.MouseMoved\connect(function(x, _) - setSliderPos(x, slider, sliderPosition, bar, steps) -) - - - slider.MouseButton1Up\connect -> - cancelSlide areaSoak - - - sliderPosition.Changed\connect(function(_) - sliderPosition.Value = math.min(steps, math.max(1, sliderPosition.Value)) - relativePosX = (sliderPosition.Value - 1) / (steps - 1) - slider.Position = - UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset) - - - bar.MouseButton1Down\connect(function(x, _) - setSliderPos(x, slider, sliderPosition, bar, steps) - - - return sliderGui, sliderPosition, sliderSteps - end - - t.CreateTrueScrollingFrame = function() - lowY = nil - highY = nil - - dragCon = nil - upCon = nil - - internalChange = false - - descendantsChangeConMap = {} - - scrollingFrame = Instance.new "Frame" - scrollingFrame.Name = "ScrollingFrame" - scrollingFrame.Active = true - scrollingFrame.Size = UDim2.new(1, 0, 1, 0) - scrollingFrame.ClipsDescendants = true - - controlFrame = Instance.new "Frame" - controlFrame.Name = "ControlFrame" - controlFrame.BackgroundTransparency = 1 - controlFrame.Size = UDim2.new 0, 18, 1, 0) - controlFrame.Position = UDim2.new(1, -20, 0, 0) - controlFrame.Parent = scrollingFrame - - scrollBottom = Instance.new "BoolValue" - scrollBottom.Value = false - scrollBottom.Name = "ScrollBottom" - scrollBottom.Parent = controlFrame - - scrollUp = Instance.new "BoolValue" - scrollUp.Value = false - scrollUp.Name = "scrollUp" - scrollUp.Parent = controlFrame - - scrollUpButton = Instance.new "TextButton" - scrollUpButton.Name = "ScrollUpButton" - scrollUpButton.Text = "" - scrollUpButton.AutoButtonColor = false - scrollUpButton.BackgroundColor3 = Color3.new 0, 0, 0 - scrollUpButton.BorderColor3 = Color3.new 1, 1, 1 - scrollUpButton.BackgroundTransparency = 0.5 - scrollUpButton.Size = UDim2.new 0, 18, 0, 18) - scrollUpButton.ZIndex = 2 - scrollUpButton.Parent = controlFrame - for i = 1, 6 - triFrame = Instance.new "Frame" - triFrame.BorderColor3 = Color3.new 1, 1, 1 - triFrame.Name = "tri" .. tostring(i) - triFrame.ZIndex = 3 - triFrame.BackgroundTransparency = 0.5 - triFrame.Size = UDim2.new 0, 12 - ((i - 1) * 2), 0, 0) - triFrame.Position = UDim2.new 0, 3 + (i - 1), 0.5, 2 - (i - 1)) - triFrame.Parent = scrollUpButton - scrollUpButton.MouseEnter\connect -> - scrollUpButton.BackgroundTransparency = 0.1 - upChildren = scrollUpButton\GetChildren! - for i = 1, #upChildren - upChildren[i].BackgroundTransparency = 0.1 - - - scrollUpButton.MouseLeave\connect -> - scrollUpButton.BackgroundTransparency = 0.5 - upChildren = scrollUpButton\GetChildren! - for i = 1, #upChildren - upChildren[i].BackgroundTransparency = 0.5 - - - - scrollDownButton = scrollUpButton\clone! - scrollDownButton.Name = "ScrollDownButton" - scrollDownButton.Position = UDim2.new 0, 0, 1, -18) - downChildren = scrollDownButton\GetChildren! - for i = 1, #downChildren - downChildren[i].Position = UDim2.new 0, 3 + (i - 1), 0.5, -2 + (i - 1)) - scrollDownButton.MouseEnter\connect -> - scrollDownButton.BackgroundTransparency = 0.1 - downChildren = scrollDownButton\GetChildren! - for i = 1, #downChildren - downChildren[i].BackgroundTransparency = 0.1 - - - scrollDownButton.MouseLeave\connect -> - scrollDownButton.BackgroundTransparency = 0.5 - downChildren = scrollDownButton\GetChildren! - for i = 1, #downChildren - downChildren[i].BackgroundTransparency = 0.5 - - - scrollDownButton.Parent = controlFrame - - scrollTrack = Instance.new "Frame" - scrollTrack.Name = "ScrollTrack" - scrollTrack.BackgroundTransparency = 1 - scrollTrack.Size = UDim2.new 0, 18, 1, -38) - scrollTrack.Position = UDim2.new 0, 0, 0, 19) - scrollTrack.Parent = controlFrame - - scrollbar = Instance.new "TextButton" - scrollbar.BackgroundColor3 = Color3.new 0, 0, 0 - scrollbar.BorderColor3 = Color3.new 1, 1, 1 - scrollbar.BackgroundTransparency = 0.5 - scrollbar.AutoButtonColor = false - scrollbar.Text = "" - scrollbar.Active = true - scrollbar.Name = "ScrollBar" - scrollbar.ZIndex = 2 - scrollbar.BackgroundTransparency = 0.5 - scrollbar.Size = UDim2.new 0, 18, 0.1, 0) - scrollbar.Position = UDim2.new 0, 0, 0, 0) - scrollbar.Parent = scrollTrack - - scrollNub = Instance.new "Frame" - scrollNub.Name = "ScrollNub" - scrollNub.BorderColor3 = Color3.new 1, 1, 1 - scrollNub.Size = UDim2.new 0, 10, 0, 0) - scrollNub.Position = UDim2.new 0.5, -5, 0.5, 0) - scrollNub.ZIndex = 2 - scrollNub.BackgroundTransparency = 0.5 - scrollNub.Parent = scrollbar - - newNub = scrollNub\clone! - newNub.Position = UDim2.new 0.5, -5, 0.5, -2) - newNub.Parent = scrollbar - - lastNub = scrollNub\clone! - lastNub.Position = UDim2.new 0.5, -5, 0.5, 2) - lastNub.Parent = scrollbar - - scrollbar.MouseEnter\connect -> - scrollbar.BackgroundTransparency = 0.1 - scrollNub.BackgroundTransparency = 0.1 - newNub.BackgroundTransparency = 0.1 - lastNub.BackgroundTransparency = 0.1 - - scrollbar.MouseLeave\connect -> - scrollbar.BackgroundTransparency = 0.5 - scrollNub.BackgroundTransparency = 0.5 - newNub.BackgroundTransparency = 0.5 - lastNub.BackgroundTransparency = 0.5 - - - mouseDrag = Instance.new "ImageButton" - mouseDrag.Active = false - mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) - mouseDrag.AutoButtonColor = false - mouseDrag.BackgroundTransparency = 1 - mouseDrag.Name = "mouseDrag" - mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) - mouseDrag.ZIndex = 10 - - positionScrollBar = (_, y, offset) - oldPos = scrollbar.Position - - if y < scrollTrack.AbsolutePosition.y - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0) - return (oldPos ~= scrollbar.Position) - - - relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y - - if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0) - return (oldPos ~= scrollbar.Position) - - newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset) / scrollTrack.AbsoluteSize.y - if newScaleYPos + relativeSize > 1 - newScaleYPos = 1 - relativeSize - scrollBottom.Value = true - scrollUp.Value = false - elseif newScaleYPos <= 0 - newScaleYPos = 0 - scrollUp.Value = true - scrollBottom.Value = false - else - scrollUp.Value = false - scrollBottom.Value = false - - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, newScaleYPos, 0) - - return (oldPos ~= scrollbar.Position) - - drillDownSetHighLow = (instance) - if not instance or not instance\IsA "GuiObject" - return - - if instance == controlFrame - return - - if instance\IsDescendantOf controlFrame) - return - - if not instance.Visible - return - - - if (lowY and lowY > instance.AbsolutePosition.Y) or not lowY - lowY = instance.AbsolutePosition.Y - - if (highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y)) or not highY - highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - - children = instance\GetChildren! - for i = 1, #children - drillDownSetHighLow(children[i]) - - - resetHighLow = () - firstChildren = scrollingFrame\GetChildren! - - for i = 1, #firstChildren - drillDownSetHighLow(firstChildren[i]) - - - recalculate = () - internalChange = true - - percentFrame = 0 - if scrollbar.Position.Y.Scale > 0 - if scrollbar.Visible - percentFrame = scrollbar.Position.Y.Scale - / ((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) / scrollTrack.AbsoluteSize.Y) - else - percentFrame = 0 - - - if percentFrame > 0.99 - percentFrame = 1 - - - hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame - - guiChildren = scrollingFrame\GetChildren! - for i = 1, #guiChildren - if guiChildren[i] ~= controlFrame - guiChildren[i].Position = UDim2.new( - guiChildren[i].Position.X.Scale, - guiChildren[i].Position.X.Offset, - 0, - math.ceil(guiChildren[i].AbsolutePosition.Y) - math.ceil(lowY) + hiddenYAmount - ) - - - - lowY = nil - highY = nil - resetHighLow! - internalChange = false - - setSliderSizeAndPosition = () - if not highY or not lowY - return - - - totalYSpan = math.abs(highY - lowY) - if totalYSpan == 0 - scrollbar.Visible = false - scrollDownButton.Visible = false - scrollUpButton.Visible = false - - if dragCon - dragCon\disconnect! - dragCon = nil - - if upCon - upCon\disconnect! - upCon = nil - - return - - - percentShown = scrollingFrame.AbsoluteSize.Y / totalYSpan - if percentShown >= 1 - scrollbar.Visible = false - scrollDownButton.Visible = false - scrollUpButton.Visible = false - recalculate! - else - scrollbar.Visible = true - scrollDownButton.Visible = true - scrollUpButton.Visible = true - - scrollbar.Size = UDim2.new(scrollbar.Size.X.Scale, scrollbar.Size.X.Offset, percentShown, 0) - - - percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY) / totalYSpan - scrollbar.Position = UDim2.new( - scrollbar.Position.X.Scale, - scrollbar.Position.X.Offset, - percentPosition, - -scrollbar.AbsoluteSize.X / 2 - ) - - if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0) - - - if - (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) - > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) - then - relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0) - - - buttonScrollAmountPixels = 7 - reentrancyGuardScrollUp = false - doScrollUp = () - if reentrancyGuardScrollUp - return - - - reentrancyGuardScrollUp = true - if positionScrollBar(0, scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels, 0) - recalculate! - - reentrancyGuardScrollUp = false - - reentrancyGuardScrollDown = false - doScrollDown = () - if reentrancyGuardScrollDown - return - - - reentrancyGuardScrollDown = true - if positionScrollBar(0, scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels, 0) - recalculate! - - reentrancyGuardScrollDown = false - - scrollUp = (mouseYPos) - if scrollUpButton.Active - scrollStamp = tick! - current = scrollStamp - local upCon - upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - upCon\disconnect! - ) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollUp! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollUp! - if mouseYPos and mouseYPos > scrollbar.AbsolutePosition.y - break - - if not scrollUpButton.Active - break - - if tick! - t > 5 - w = 0 - elseif tick! - t > 2 - w = 0.06 - - wait w - - - - scrollDown = (mouseYPos) - if scrollDownButton.Active - scrollStamp = tick! - current = scrollStamp - local downCon - downCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - downCon\disconnect! - ) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollDown! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollDown! - if mouseYPos and mouseYPos < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x) - break - - if not scrollDownButton.Active - break - - if tick! - t > 5 - w = 0 - elseif tick! - t > 2 - w = 0.06 - - wait w - - - - scrollbar.MouseButton1Down\connect((x, y ->) - if scrollbar.Active - scrollStamp = tick! - mouseOffset = y - scrollbar.AbsolutePosition.y - if dragCon - dragCon\disconnect! - dragCon = nil - - if upCon - upCon\disconnect! - upCon = nil - - reentrancyGuardMouseScroll = false - dragCon = mouseDrag.MouseMoved\connect((x, y ->) - if reentrancyGuardMouseScroll - return - - - reentrancyGuardMouseScroll = true - if positionScrollBar(x, y, mouseOffset) - recalculate! - - reentrancyGuardMouseScroll = false - ) - upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - dragCon\disconnect! - dragCon = nil - upCon\disconnect! - drag = nil - ) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - - - - scrollMouseCount = 0 - - scrollUpButton.MouseButton1Down\connect -> - scrollUp! - - scrollDownButton.MouseButton1Down\connect -> - scrollDown! - - - scrollTick = () - scrollStamp = tick! - - scrollUpButton.MouseButton1Up\connect(scrollTick) - scrollDownButton.MouseButton1Up\connect(scrollTick) - scrollbar.MouseButton1Up\connect(scrollTick) - - -- heightCheck = (instance) - -- if (highY and (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) > highY) or not highY - -- highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - -- end - -- setSliderSizeAndPosition() - -- end - - highLowRecheck = () - oldLowY = lowY - oldHighY = highY - lowY = nil - highY = nil - resetHighLow! - - if (lowY ~= oldLowY) or (highY ~= oldHighY) - setSliderSizeAndPosition() - - - descendantChanged = (this, prop) - if internalChange - return - - if not this.Visible - return - - - if prop == "Size" or prop == "Position" - wait! - highLowRecheck! - - - scrollingFrame.DescendantAdded\connect((i ->nstance) - if not instance\IsA "GuiObject" - return - - - if instance.Visible - wait! -- wait a heartbeat for sizes to reconfig - highLowRecheck! - - - descendantsChangeConMap[instance] = instance.Changed\connect((p ->rop) - descendantChanged(instance, prop) -) - - - scrollingFrame.DescendantRemoving\connect((i ->nstance) - if not instance\IsA "GuiObject" - return - - if descendantsChangeConMap[instance] - descendantsChangeConMap[instance]\disconnect! - descendantsChangeConMap[instance] = nil - - wait! -- wait a heartbeat for sizes to reconfig - highLowRecheck! - - - scrollingFrame.Changed\connect((p ->rop) - if prop == "AbsoluteSize" - if not highY or not lowY - return - - - highLowRecheck! - setSliderSizeAndPosition() - - - - return scrollingFrame, controlFrame - end - - t.CreateScrollingFrame = function(orderList, scrollStyle) - frame = Instance.new "Frame" - frame.Name = "ScrollingFrame" - frame.BackgroundTransparency = 1 - frame.Size = UDim2.new(1, 0, 1, 0) - - scrollUpButton = Instance.new "ImageButton" - scrollUpButton.Name = "ScrollUpButton" - scrollUpButton.BackgroundTransparency = 1 - scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" - scrollUpButton.Size = UDim2.new 0, 17, 0, 17) - - scrollDownButton = Instance.new "ImageButton" - scrollDownButton.Name = "ScrollDownButton" - scrollDownButton.BackgroundTransparency = 1 - scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" - scrollDownButton.Size = UDim2.new 0, 17, 0, 17) - - scrollbar = Instance.new "ImageButton" - scrollbar.Name = "ScrollBar" - scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" - scrollbar.BackgroundTransparency = 1 - scrollbar.Size = UDim2.new 0, 18, 0, 150) - - scrollStamp = 0 - - scrollDrag = Instance.new "ImageButton" - scrollDrag.Image = "http://www.roblox.com/asset/?id=61367186" - scrollDrag.Size = UDim2.new(1, 0, 0, 16) - scrollDrag.BackgroundTransparency = 1 - scrollDrag.Name = "ScrollDrag" - scrollDrag.Active = true - scrollDrag.Parent = scrollbar - - mouseDrag = Instance.new "ImageButton" - mouseDrag.Active = false - mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) - mouseDrag.AutoButtonColor = false - mouseDrag.BackgroundTransparency = 1 - mouseDrag.Name = "mouseDrag" - mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) - mouseDrag.ZIndex = 10 - - style = "simple" - if scrollStyle and tostring(scrollStyle) - style = scrollStyle - - scrollPosition = 1 - rowSize = 0 +t.CreateScrollingFrame = (orderList, scrollStyle) -> + frame = New "Frame", "ScrollingFrame" + BackgroundTransparency: 1 + Size: UDim2.new 1, 0, 1, 0 + + scrollUpButton = New "ImageButton", "ScrollUpButton" + BackgroundTransparency: 1 + Image: "rbxasset://textures/ui/scrollbuttonUp.png" + Size: UDim2.new 0, 17, 0, 17 + + scrollDownButton = New "ImageButton", "ScrollDownButton" + BackgroundTransparency: 1 + Image: "rbxasset://textures/ui/scrollbuttonDown.png" + Size: UDim2.new 0, 17, 0, 17 + + scrollbar = New "ImageButton", "ScrollBar" + Image: "rbxasset://textures/ui/scrollbar.png" + BackgroundTransparency: 1 + Size: UDim2.new 0, 18, 0, 150 + + * New "ImageButton", "ScrollDrag" + Image: "http://www.roblox.com/asset/?id=61367186" + Size: UDim2.new 1, 0, 0, 16 + BackgroundTransparency: 1 + Active: true + + :scrollDrag = scrollbar + + mouseDrag = New "ImageButton", "mouseDrag" + Active: false + Size: UDim2.new 1.5, 0, 1.5, 0 + AutoButtonColor: false + BackgroundTransparency: 1 + Position: UDim2.new -0.25, 0, -0.25, 0 + ZIndex: 10 + + scrollStamp = 0 + + style = "simple" + if scrollStyle and tostring scrollStyle + style = scrollStyle + + scrollPosition = 1 + rowSize = 0 + howManyDisplayed = 0 + + layoutGridScrollBar = -> howManyDisplayed = 0 + guiObjects = {} + if orderList + for _, child in ipairs orderList + if child.Parent == frame + table.insert guiObjects, child - layoutGridScrollBar = function() - howManyDisplayed = 0 - guiObjects = {} - if orderList - for _, child in ipairs(orderList) - if child.Parent == frame - table.insert(guiObjects, child) - - - else - children = frame\GetChildren! - if children - for _, child in ipairs(children) - if child\IsA "GuiObject" - table.insert(guiObjects, child) - - - - - if #guiObjects == 0 - scrollUpButton.Active = false - scrollDownButton.Active = false - scrollDrag.Active = false - scrollPosition = 1 - return - - - if scrollPosition > #guiObjects - scrollPosition = #guiObjects - - - if scrollPosition < 1 - scrollPosition = 1 - - - totalPixelsY = frame.AbsoluteSize.Y - pixelsRemainingY = frame.AbsoluteSize.Y - - totalPixelsX = frame.AbsoluteSize.X - - xCounter = 0 - rowSizeCounter = 0 - setRowSize = true - - pixelsBelowScrollbar = 0 - pos = #guiObjects - - currentRowY = 0 - - pos = scrollPosition - --count up from current scroll position to fill out grid - while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY - xCounter += guiObjects[pos].AbsoluteSize.X - --previous pos was the end of a row - if xCounter >= totalPixelsX - pixelsBelowScrollbar += currentRowY - currentRowY = 0 - xCounter = guiObjects[pos].AbsoluteSize.X - - if guiObjects[pos].AbsoluteSize.Y > currentRowY - currentRowY = guiObjects[pos].AbsoluteSize.Y - - pos += 1 - - --Count wherever current row left off - pixelsBelowScrollbar += currentRowY - currentRowY = 0 - - pos = scrollPosition - 1 - xCounter = 0 - - --objects with varying X,Y dimensions can rarely cause minor errors - --rechecking every new scrollPosition is necessary to avoid 100% of errors - - --count backwards from current scrollPosition to see if we can add more rows - while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 - xCounter += guiObjects[pos].AbsoluteSize.X - rowSizeCounter += 1 - if xCounter >= totalPixelsX - rowSize = rowSizeCounter - 1 - rowSizeCounter = 0 - xCounter = guiObjects[pos].AbsoluteSize.X - if pixelsBelowScrollbar + currentRowY <= totalPixelsY - --It fits, so back up our scroll position - pixelsBelowScrollbar += currentRowY - if scrollPosition <= rowSize - scrollPosition = 1 - break - else - scrollPosition -= rowSize - - currentRowY = 0 - else - break - - - - if guiObjects[pos].AbsoluteSize.Y > currentRowY - currentRowY = guiObjects[pos].AbsoluteSize.Y - - - pos -= 1 - - - --Do check last time if pos = 0 - if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) - scrollPosition = 1 - - - xCounter = 0 - --pos = scrollPosition - rowSizeCounter = 0 - setRowSize = true - lastChildSize = 0 - - local xOffset, yOffset = 0 - if guiObjects[1] - yOffset = math.ceil(math.floor(math.fmod(totalPixelsY, guiObjects[1].AbsoluteSize.X)) / 2) - xOffset = math.ceil(math.floor(math.fmod(totalPixelsX, guiObjects[1].AbsoluteSize.Y)) / 2) - - - for i, child in ipairs(guiObjects) - if i < scrollPosition - --print("Hiding " .. child.Name) - child.Visible = false - else - if pixelsRemainingY < 0 - --print("Out of Space " .. child.Name) - child.Visible = false - else - --print("Laying out " .. child.Name) - --GuiObject - if setRowSize - rowSizeCounter += 1 - - if xCounter + child.AbsoluteSize.X >= totalPixelsX - if setRowSize - rowSize = rowSizeCounter - 1 - setRowSize = false - - xCounter = 0 - pixelsRemainingY -= child.AbsoluteSize.Y - - child.Position = UDim2.new( - child.Position.X.Scale, - xCounter + xOffset, - 0, - totalPixelsY - pixelsRemainingY + yOffset - ) - xCounter += child.AbsoluteSize.X - child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) - if child.Visible - howManyDisplayed += 1 - - lastChildSize = child.AbsoluteSize - - - - - scrollUpButton.Active = (scrollPosition > 1) - if lastChildSize == 0 - scrollDownButton.Active = false - else - scrollDownButton.Active = ((pixelsRemainingY - lastChildSize.Y) < 0) - - scrollDrag.Active = #guiObjects > howManyDisplayed - scrollDrag.Visible = scrollDrag.Active - - layoutSimpleScrollBar = function() - guiObjects = {} - howManyDisplayed = 0 - - if orderList - for _, child in ipairs(orderList) - if child.Parent == frame - table.insert(guiObjects, child) - - - else - children = frame\GetChildren! - if children - for i, child in ipairs(children) - if child\IsA "GuiObject" - table.insert(guiObjects, child) - - - - - if #guiObjects == 0 - scrollUpButton.Active = false - scrollDownButton.Active = false - scrollDrag.Active = false - scrollPosition = 1 - return - - - if scrollPosition > #guiObjects - scrollPosition = #guiObjects - - - totalPixels = frame.AbsoluteSize.Y - pixelsRemaining = frame.AbsoluteSize.Y - - pixelsBelowScrollbar = 0 - pos = #guiObjects - while pixelsBelowScrollbar < totalPixels and pos >= 1 - if pos >= scrollPosition - pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y - else - if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels - --It fits, so back up our scroll position - pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y - if scrollPosition <= 1 - scrollPosition = 1 - break - else - --local ("Backing up ScrollPosition from -- " ..scrollPosition) - scrollPosition -= 1 - - else - break - - - pos -= 1 - - - pos = scrollPosition - for i, child in ipairs(guiObjects) - if i < scrollPosition - --print("Hiding " .. child.Name) - child.Visible = false - else - if pixelsRemaining < 0 - --print("Out of Space " .. child.Name) - child.Visible = false - else - --print("Laying out " .. child.Name) - --GuiObject - child.Position = - UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) - pixelsRemaining -= child.AbsoluteSize.Y - if pixelsRemaining >= 0 - child.Visible = true - howManyDisplayed += 1 - else - child.Visible = false - - - - - scrollUpButton.Active = (scrollPosition > 1) - scrollDownButton.Active = (pixelsRemaining < 0) - scrollDrag.Active = #guiObjects > howManyDisplayed - scrollDrag.Visible = scrollDrag.Active - - moveDragger = function() - guiObjects = 0 + else children = frame\GetChildren! if children - for _, child in ipairs(children) + for _, child in ipairs children if child\IsA "GuiObject" - guiObjects += 1 + table.insert guiObjects, child + if #guiObjects == 0 + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + if scrollPosition > #guiObjects + scrollPosition = #guiObjects + if scrollPosition < 1 + scrollPosition = 1 - if not scrollDrag.Parent - return + totalPixelsY = frame.AbsoluteSize.Y + pixelsRemainingY = frame.AbsoluteSize.Y + totalPixelsX = frame.AbsoluteSize.X - dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1 / (guiObjects - howManyDisplayed + 1)) - if dragSizeY < 16 - dragSizeY = 16 + xCounter = 0 + rowSizeCounter = 0 + setRowSize = true - scrollDrag.Size = - UDim2.new(scrollDrag.Size.X.Scale, scrollDrag.Size.X.Offset, scrollDrag.Size.Y.Scale, dragSizeY) + pixelsBelowScrollbar = 0 + pos = #guiObjects - relativeYPos = (scrollPosition - 1) / (guiObjects - howManyDisplayed) - if relativeYPos > 1 - relativeYPos = 1 - elseif relativeYPos < 0 - relativeYPos = 0 + currentRowY = 0 - absYPos = 0 + pos = scrollPosition + --count up from current scroll position to fill out grid + while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY + xCounter += guiObjects[pos].AbsoluteSize.X + --previous pos was the of a row + if xCounter >= totalPixelsX + pixelsBelowScrollbar += currentRowY + currentRowY = 0 + xCounter = guiObjects[pos].AbsoluteSize.X - if relativeYPos ~= 0 - absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) + if guiObjects[pos].AbsoluteSize.Y > currentRowY + currentRowY = guiObjects[pos].AbsoluteSize.Y + pos += 1 - scrollDrag.Position = - UDim2.new(scrollDrag.Position.X.Scale, scrollDrag.Position.X.Offset, scrollDrag.Position.Y.Scale, absYPos) + --Count wherever current row left off + pixelsBelowScrollbar += currentRowY + currentRowY = 0 - reentrancyGuard = false - recalculate = function() - if reentrancyGuard - return + pos = scrollPosition - 1 + xCounter = 0 - reentrancyGuard = true - wait! - local success, err = nil - if style == "grid" - success, err = pcall(function() - layoutGridScrollBar() - ) - elseif style == "simple" - success, err = pcall(function() - layoutSimpleScrollBar() - ) + --objects with varying X,Y dimensions can rarely cause minor errors + --rechecking every new scrollPosition is necessary to avoid 100% of errors - if not success - print(err) - - moveDragger() - reentrancyGuard = false - - doScrollUp = function() - scrollPosition -= rowSize - if scrollPosition < 1 - scrollPosition = 1 - - recalculate(nil) - - doScrollDown = function() - scrollPosition += rowSize - recalculate(nil) - - scrollUp = function(mouseYPos) - if scrollUpButton.Active - scrollStamp = tick! - current = scrollStamp - local upCon - upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - upCon\disconnect! - ) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollUp! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollUp! - if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y + --count backwards from current scrollPosition to see if we can add more rows + while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 + xCounter += guiObjects[pos].AbsoluteSize.X + rowSizeCounter += 1 + if xCounter >= totalPixelsX + rowSize = rowSizeCounter - 1 + rowSizeCounter = 0 + xCounter = guiObjects[pos].AbsoluteSize.X + if pixelsBelowScrollbar + currentRowY <= totalPixelsY + --It fits, so back up our scroll position + pixelsBelowScrollbar += currentRowY + if scrollPosition <= rowSize + scrollPosition = 1 break - - if not scrollUpButton.Active - break - - if tick! - t > 5 - w = 0 - elseif tick! - t > 2 - w = 0.06 - - wait w - - - - scrollDown = function(mouseYPos) - if scrollDownButton.Active - scrollStamp = tick! - current = scrollStamp - local downCon - downCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - downCon\disconnect! - ) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollDown! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollDown! - if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) - break - - if not scrollDownButton.Active - break - - if tick! - t > 5 - w = 0 - elseif tick! - t > 2 - w = 0.06 - - wait w - - - - -- y = 0 - scrollDrag.MouseButton1Down\connect(function(_, y) - if scrollDrag.Active - scrollStamp = tick! - mouseOffset = y - scrollDrag.AbsolutePosition.y - local dragCon - local upCon - dragCon = mouseDrag.MouseMoved\connect(function(_, y) - barAbsPos = scrollbar.AbsolutePosition.y - barAbsSize = scrollbar.AbsoluteSize.y - - dragAbsSize = scrollDrag.AbsoluteSize.y - barAbsOne = barAbsPos + barAbsSize - dragAbsSize - y -= mouseOffset - y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y - y -= barAbsPos - - guiObjects = 0 - children = frame\GetChildren! - if children - for _, child in ipairs(children) - if child\IsA "GuiObject" - guiObjects += 1 - - doublePercent = y / (barAbsSize - dragAbsSize) - rowDiff = rowSize - totalScrollCount = guiObjects - (howManyDisplayed - 1) - newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff - if newScrollPosition < scrollPosition - rowDiff = -rowDiff - - if newScrollPosition < 1 - newScrollPosition = 1 - - scrollPosition = newScrollPosition - recalculate(nil) - ) - upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - dragCon\disconnect! - dragCon = nil - upCon\disconnect! - drag = nil - ) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - - - - scrollMouseCount = 0 - - scrollUpButton.MouseButton1Down\connect -> - scrollUp! - - scrollUpButton.MouseButton1Up\connect -> - scrollStamp = tick! - - - scrollDownButton.MouseButton1Up\connect -> - scrollStamp = tick! - - scrollDownButton.MouseButton1Down\connect -> - scrollDown! - - - scrollbar.MouseButton1Up\connect -> - scrollStamp = tick! - - scrollbar.MouseButton1Down\connect(function(_, y) - if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y) - scrollDown(y) - elseif y < scrollDrag.AbsolutePosition.y - scrollUp(y) - - - - frame.ChildAdded\connect -> - recalculate(nil) - - - frame.ChildRemoved\connect -> - recalculate(nil) - - - frame.Changed\connect((p ->rop) - if prop == "AbsoluteSize" - --Wait a heartbeat for it to sync in - recalculate(nil) - - - frame.AncestryChanged\connect -> - recalculate(nil) - - - return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar - end - binaryGrow = (min, max, fits) - if min > max - return min - biggestLegal = min - - while min <= max - mid = min + math.floor((max - min) / 2) - if fits(mid) and (biggestLegal == nil or biggestLegal < mid) - biggestLegal = mid - - --Try growing - min = mid + 1 - else - --Doesn't fit, shrink - max = mid - 1 - - return biggestLegal - end - - binaryShrink = (min, max, fits) - if min > max - return min - smallestLegal = max - - while min <= max - mid = min + math.floor((max - min) / 2) - if fits(mid) and (smallestLegal == nil or smallestLegal > mid) - smallestLegal = mid - - --It fits, shrink - max = mid - 1 - else - --Doesn't fit, grow - min = mid + 1 - - return smallestLegal - end - - getGuiOwner = (instance) - while instance ~= nil - if instance\IsA "ScreenGui" or instance\IsA "BillboardGui" - return instance - - instance = instance.Parent - return nil - end - - t.AutoTruncateTextObject = function(textLabel) - text = textLabel.Text - - fullLabel = textLabel\Clone! - fullLabel.Name = "Full" .. textLabel.Name - fullLabel.BorderSizePixel = 0 - fullLabel.BackgroundTransparency = 0 - fullLabel.Text = text - fullLabel.TextXAlignment = Enum.TextXAlignment.Center - fullLabel.Position = UDim2.new 0, -3, 0, 0) - fullLabel.Size = UDim2.new 0, 100, 1, 0) - fullLabel.Visible = false - fullLabel.Parent = textLabel - - shortText = nil - mouseEnterConnection = nil - mouseLeaveConnection = nil - - checkForResize = function() - if getGuiOwner(textLabel) == nil - return - - textLabel.Text = text - if textLabel.TextFits - --Tear down the rollover if it is active - if mouseEnterConnection - mouseEnterConnection\disconnect! - mouseEnterConnection = nil - - if mouseLeaveConnection - mouseLeaveConnection\disconnect! - mouseLeaveConnection = nil - - else - len = string.len(text) - textLabel.Text = text .. "~" - - --Shrink the text - textSize = binaryGrow(0, len, function(pos) - if pos == 0 - textLabel.Text = "~" else - textLabel.Text = string.sub(text, 1, pos) .. "~" + scrollPosition -= rowSize - return textLabel.TextFits - ) - shortText = string.sub(text, 1, textSize) .. "~" - textLabel.Text = shortText + currentRowY = 0 + else + break - --Make sure the fullLabel fits - if not fullLabel.TextFits - --Already too small, grow it really bit to start - fullLabel.Size = UDim2.new 0, 10000, 1, 0) + if guiObjects[pos].AbsoluteSize.Y > currentRowY + currentRowY = guiObjects[pos].AbsoluteSize.Y + pos -= 1 - --Okay, now try to binary shrink it back down - fullLabelSize = binaryShrink(textLabel.AbsoluteSize.X, fullLabel.AbsoluteSize.X, function(size) - fullLabel.Size = UDim2.new 0, size, 1, 0) - return fullLabel.TextFits - ) - fullLabel.Size = UDim2.new 0, fullLabelSize + 6, 1, 0) + --Do check last time if pos = 0 + if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) + scrollPosition = 1 - --Now setup the rollover effects, if they are currently off - if mouseEnterConnection == nil - mouseEnterConnection = textLabel.MouseEnter\connect -> - fullLabel.ZIndex = textLabel.ZIndex + 1 - fullLabel.Visible = true - --textLabel.Text = "" - ) + xCounter = 0 + --pos = scrollPosition + rowSizeCounter = 0 + setRowSize = true + lastChildSize = 0 - if mouseLeaveConnection == nil - mouseLeaveConnection = textLabel.MouseLeave\connect -> - fullLabel.Visible = false - --textLabel.Text = shortText - ) + xOffset = yOffset = 0 + if guiObjects[1] + yOffset = math.ceil math.floor(math.fmod(totalPixelsY, guiObjects[1].AbsoluteSize.X)) / 2 + xOffset = math.ceil math.floor(math.fmod(totalPixelsX, guiObjects[1].AbsoluteSize.Y)) / 2 + for i, child in ipairs guiObjects + if i < scrollPosition + --print "Hiding #{child.Name}" + child.Visible = false + else + if pixelsRemainingY < 0 + --print "Out of Space #{child.Name}" + child.Visible = false + else + --print "Laying out #{child.Name}" + --GuiObject + if setRowSize + rowSizeCounter += 1 - textLabel.AncestryChanged\connect(checkForResize) - textLabel.Changed\connect((p ->rop) - if prop == "AbsoluteSize" - checkForResize() + if xCounter + child.AbsoluteSize.X >= totalPixelsX + if setRowSize + rowSize = rowSizeCounter - 1 + setRowSize = false + xCounter = 0 + pixelsRemainingY -= child.AbsoluteSize.Y - - checkForResize() - - changeText = (newText) - text = newText - fullLabel.Text = text - checkForResize() - - return textLabel, changeText - end - - TransitionTutorialPages = (fromPage, toPage, transitionFrame, currentPageValue) - if fromPage - fromPage.Visible = false - if transitionFrame.Visible == false - transitionFrame.Size = fromPage.Size - transitionFrame.Position = fromPage.Position - - else - if transitionFrame.Visible == false - transitionFrame.Size = UDim2.new 0, 50, 0, 50) - transitionFrame.Position = UDim2.new 0.5, -25, 0.5, -25) - - transitionFrame.Visible = true - currentPageValue.Value = nil - - local newSize, newPosition - if toPage - --Make it visible so it resizes - toPage.Visible = true - - newSize = toPage.Size - newPosition = toPage.Position - - toPage.Visible = false - else - newSize = UDim2.new 0, 50, 0, 50) - newPosition = UDim2.new 0.5, -25, 0.5, -25) - transitionFrame:TweenSizeAndPosition( - newSize, - newPosition, - Enum.EasingDirection.InOut, - Enum.EasingStyle.Quad, - 0.3, - true, - function(state) - if state == Enum.TweenStatus.Completed - transitionFrame.Visible = false - if toPage - toPage.Visible = true - currentPageValue.Value = toPage - - - - ) - end - - t.CreateTutorial = function(name, tutorialKey, createButtons) - frame = Instance.new "Frame" - frame.Name = "Tutorial-" .. name - frame.BackgroundTransparency = 1 - frame.Size = UDim2.new 0.6, 0, 0.6, 0) - frame.Position = UDim2.new 0.2, 0, 0.2, 0) - - transitionFrame = Instance.new "Frame" - transitionFrame.Name = "TransitionFrame" - transitionFrame.Style = Enum.FrameStyle.RobloxRound - transitionFrame.Size = UDim2.new 0.6, 0, 0.6, 0) - transitionFrame.Position = UDim2.new 0.2, 0, 0.2, 0) - transitionFrame.Visible = false - transitionFrame.Parent = frame - - currentPageValue = Instance.new "ObjectValue" - currentPageValue.Name = "CurrentTutorialPage" - currentPageValue.Value = nil - currentPageValue.Parent = frame - - boolValue = Instance.new "BoolValue" - boolValue.Name = "Buttons" - boolValue.Value = createButtons - boolValue.Parent = frame - - pages = Instance.new "Frame" - pages.Name = "Pages" - pages.BackgroundTransparency = 1 - pages.Size = UDim2.new(1, 0, 1, 0) - pages.Parent = frame - - getVisiblePageAndHideOthers = () - visiblePage = nil - children = pages\GetChildren! - if children - for _, child in ipairs(children) + child.Position = UDim2.new( + child.Position.X.Scale, + xCounter + xOffset, + 0, + totalPixelsY - pixelsRemainingY + yOffset + ) + xCounter += child.AbsoluteSize.X + child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) if child.Visible - if visiblePage - child.Visible = false - else - visiblePage = child + howManyDisplayed += 1 + lastChildSize = child.AbsoluteSize + scrollUpButton.Active = (scrollPosition > 1) - - return visiblePage - - showTutorial = function(alwaysShow) - if alwaysShow or UserSettings().GameSettings:GetTutorialState(tutorialKey) == false - print("Showing tutorial-", tutorialKey) - currentTutorialPage = getVisiblePageAndHideOthers() - - firstPage = pages:FindFirstChild "TutorialPage1" - if firstPage - TransitionTutorialPages(currentTutorialPage, firstPage, transitionFrame, currentPageValue) - else - error "Could not find TutorialPage1" - - - - dismissTutorial = function() - currentTutorialPage = getVisiblePageAndHideOthers() - - if currentTutorialPage - TransitionTutorialPages(currentTutorialPage, nil, transitionFrame, currentPageValue) - - - UserSettings().GameSettings:SetTutorialState(tutorialKey, true) - - gotoPage = function(pageNum) - page = pages:FindFirstChild("TutorialPage" .. pageNum) - currentTutorialPage = getVisiblePageAndHideOthers() - TransitionTutorialPages(currentTutorialPage, page, transitionFrame, currentPageValue) - - return frame, showTutorial, dismissTutorial, gotoPage - end - - CreateBasicTutorialPage = (name, handleResize, skipTutorial, giveDoneButton) - frame = Instance.new "Frame" - frame.Name = "TutorialPage" - frame.Style = Enum.FrameStyle.RobloxRound - frame.Size = UDim2.new 0.6, 0, 0.6, 0) - frame.Position = UDim2.new 0.2, 0, 0.2, 0) - frame.Visible = false - - frameHeader = Instance.new "TextLabel" - frameHeader.Name = "Header" - frameHeader.Text = name - frameHeader.BackgroundTransparency = 1 - frameHeader.FontSize = Enum.FontSize.Size24 - frameHeader.Font = Enum.Font.ArialBold - frameHeader.TextColor3 = Color3.new 1, 1, 1 - frameHeader.TextXAlignment = Enum.TextXAlignment.Center - frameHeader.TextWrap = true - frameHeader.Size = UDim2.new(1, -55, 0, 22) - frameHeader.Position = UDim2.new 0, 0, 0, 0) - frameHeader.Parent = frame - - skipButton = Instance.new "ImageButton" - skipButton.Name = "SkipButton" - skipButton.AutoButtonColor = false - skipButton.BackgroundTransparency = 1 - skipButton.Image = "rbxasset://textures/ui/closeButton.png" - skipButton.MouseButton1Click\connect -> - skipTutorial() - - skipButton.MouseEnter\connect -> - skipButton.Image = "rbxasset://textures/ui/closeButton_dn.png" - - skipButton.MouseLeave\connect -> - skipButton.Image = "rbxasset://textures/ui/closeButton.png" - - skipButton.Size = UDim2.new 0, 25, 0, 25) - skipButton.Position = UDim2.new(1, -25, 0, 0) - skipButton.Parent = frame - - if giveDoneButton - doneButton = Instance.new "TextButton" - doneButton.Name = "DoneButton" - doneButton.Style = Enum.ButtonStyle.RobloxButtonDefault - doneButton.Text = "Done" - doneButton.TextColor3 = Color3.new 1, 1, 1 - doneButton.Font = Enum.Font.ArialBold - doneButton.FontSize = Enum.FontSize.Size18 - doneButton.Size = UDim2.new 0, 100, 0, 50) - doneButton.Position = UDim2.new 0.5, -50, 1, -50) - - if skipTutorial - doneButton.MouseButton1Click\connect -> - skipTutorial() - ) - - - doneButton.Parent = frame - - innerFrame = Instance.new "Frame" - innerFrame.Name = "ContentFrame" - innerFrame.BackgroundTransparency = 1 - innerFrame.Position = UDim2.new 0, 0, 0, 25) - innerFrame.Parent = frame - - nextButton = Instance.new "TextButton" - nextButton.Name = "NextButton" - nextButton.Text = "Next" - nextButton.TextColor3 = Color3.new 1, 1, 1 - nextButton.Font = Enum.Font.Arial - nextButton.FontSize = Enum.FontSize.Size18 - nextButton.Style = Enum.ButtonStyle.RobloxButtonDefault - nextButton.Size = UDim2.new 0, 80, 0, 32) - nextButton.Position = UDim2.new 0.5, 5, 1, -32) - nextButton.Active = false - nextButton.Visible = false - nextButton.Parent = frame - - prevButton = Instance.new "TextButton" - prevButton.Name = "PrevButton" - prevButton.Text = "Previous" - prevButton.TextColor3 = Color3.new 1, 1, 1 - prevButton.Font = Enum.Font.Arial - prevButton.FontSize = Enum.FontSize.Size18 - prevButton.Style = Enum.ButtonStyle.RobloxButton - prevButton.Size = UDim2.new 0, 80, 0, 32) - prevButton.Position = UDim2.new 0.5, -85, 1, -32) - prevButton.Active = false - prevButton.Visible = false - prevButton.Parent = frame - - if giveDoneButton - innerFrame.Size = UDim2.new(1, 0, 1, -75) + scrollDownButton.Active = if lastChildSize == 0 + false else - innerFrame.Size = UDim2.new(1, 0, 1, -22) + (pixelsRemainingY - lastChildSize.Y) < 0 - parentConnection = nil - - basicHandleResize = () - if frame.Visible and frame.Parent - maxSize = math.min(frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y) - handleResize(200, maxSize) + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active - frame.Changed\connect((p ->rop) - if prop == "Parent" - if parentConnection ~= nil - parentConnection\disconnect! - parentConnection = nil + layoutSimpleScrollBar = -> + guiObjects = {} + howManyDisplayed = 0 - if frame.Parent and frame.Parent\IsA "GuiObject" - parentConnection = frame.Parent.Changed\connect(function(parentProp) - if parentProp == "AbsoluteSize" - wait! - basicHandleResize() + if orderList + for _, child in ipairs orderList + if child.Parent == frame + table.insert guiObjects, child + else + children = frame\GetChildren! + if children + for _, child in ipairs children + if child\IsA "GuiObject" + table.insert guiObjects, child + + if #guiObjects == 0 + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + + if scrollPosition > #guiObjects + scrollPosition = #guiObjects + + totalPixels = frame.AbsoluteSize.Y + pixelsRemaining = frame.AbsoluteSize.Y + + pixelsBelowScrollbar = 0 + pos = #guiObjects + while pixelsBelowScrollbar < totalPixels and pos >= 1 + if pos >= scrollPosition + pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y + else + if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels + --It fits, so back up our scroll position + pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y + if scrollPosition <= 1 + scrollPosition = 1 + break + else + --local ("Backing up ScrollPosition from -- " ..scrollPosition) + scrollPosition -= 1 + else break + + pos -= 1 + + + pos = scrollPosition + for i, child in ipairs guiObjects + if i < scrollPosition + -- print "Hiding #{child.Name}" + child.Visible = false + else + if pixelsRemaining < 0 + --print "Out of Space #{child.Name}" + child.Visible = false + else + --print "Laying out #{child.Name}" + --GuiObject + child.Position = UDim2.new( + child.Position.X.Scale, + child.Position.X.Offset, + 0, + totalPixels - pixelsRemaining + ) + pixelsRemaining -= child.AbsoluteSize.Y + if pixelsRemaining >= 0 + child.Visible = true + howManyDisplayed += 1 + else + child.Visible = false + + scrollUpButton.Active = (scrollPosition > 1) + scrollDownButton.Active = (pixelsRemaining < 0) + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active + + moveDragger = -> + guiObjects = 0 + children = frame\GetChildren! + if children + for _, child in ipairs children + if child\IsA "GuiObject" + guiObjects += 1 + + return if not scrollDrag.Parent + + dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1 / (guiObjects - howManyDisplayed + 1)) + if dragSizeY < 16 + dragSizeY = 16 + + scrollDrag.Size = UDim2.new( + scrollDrag.Size.X.Scale, + scrollDrag.Size.X.Offset, + scrollDrag.Size.Y.Scale, + dragSizeY ) - basicHandleResize() + + relativeYPos = (scrollPosition - 1) / (guiObjects - howManyDisplayed) + if relativeYPos > 1 + relativeYPos = 1 + elseif relativeYPos < 0 + relativeYPos = 0 + + absYPos = 0 + + if relativeYPos ~= 0 + absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) - - if prop == "Visible" - basicHandleResize() + scrollDrag.Position = UDim2.new( + scrollDrag.Position.X.Scale, + scrollDrag.Position.X.Offset, + scrollDrag.Position.Y.Scale, + absYPos + ) + reentrancyGuard = false + recalculate = -> + return if reentrancyGuard - return frame, innerFrame - end + reentrancyGuard = true + wait! + local success, err + if style == "grid" + success, err = pcall -> + layoutGridScrollBar! - t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) - frame = nil - contentFrame = nil + elseif style == "simple" + success, err = pcall -> + layoutSimpleScrollBar! + + if not success + print err + + moveDragger! + reentrancyGuard = false + + + doScrollUp = -> + scrollPosition -= rowSize + if scrollPosition < 1 + scrollPosition = 1 + + recalculate nil + + doScrollDown = -> + scrollPosition += rowSize + recalculate nil + + scrollUp = (mouseYPos) -> + if scrollUpButton.Active + scrollStamp = tick! + current = scrollStamp + upCon = mouseDrag.MouseButton1Up\connect -> + scrollStamp = tick! + mouseDrag.Parent = nil + upCon\disconnect! + + mouseDrag.Parent = getScreenGuiAncestor scrollbar + doScrollUp! + wait 0.2 + t = tick! + w = 0.1 + while scrollStamp == current + doScrollUp! + break if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y + break if not scrollUpButton.Active + + w = if tick! - t > 5 + 0 + elseif tick! - t > 2 + 0.06 + + wait w + + scrollDown = (mouseYPos) -> + if scrollDownButton.Active + scrollStamp = tick! + current = scrollStamp + downCon = mouseDrag.MouseButton1Up\connect -> + scrollStamp = tick! + mouseDrag.Parent = nil + downCon\disconnect! + + mouseDrag.Parent = getScreenGuiAncestor scrollbar + doScrollDown! + wait 0.2 + t = tick! + w = 0.1 + while scrollStamp == current + doScrollDown! + break if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) + break if not scrollDownButton.Active + + w = if tick! - t > 5 + 0 + elseif tick! - t > 2 + 0.06 + + wait w + + -- y = 0 + scrollDrag.MouseButton1Down\connect (_, y) -> + if scrollDrag.Active + scrollStamp = tick! + mouseOffset = y - scrollDrag.AbsolutePosition.y + local dragCon, upCon + dragCon = mouseDrag.MouseMoved\connect (_, y) -> + barAbsPos = scrollbar.AbsolutePosition.y + barAbsSize = scrollbar.AbsoluteSize.y + + dragAbsSize = scrollDrag.AbsoluteSize.y + barAbsOne = barAbsPos + barAbsSize - dragAbsSize + y -= mouseOffset + y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y + y -= barAbsPos + + guiObjects = 0 + children = frame\GetChildren! + if children + for _, child in ipairs children + if child\IsA "GuiObject" + guiObjects += 1 + + doublePercent = y / (barAbsSize - dragAbsSize) + rowDiff = rowSize + totalScrollCount = guiObjects - (howManyDisplayed - 1) + newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff + if newScrollPosition < scrollPosition + rowDiff = -rowDiff + + if newScrollPosition < 1 + newScrollPosition = 1 + + scrollPosition = newScrollPosition + recalculate nil + + upCon = mouseDrag.MouseButton1Up\connect -> + scrollStamp = tick! + mouseDrag.Parent = nil + dragCon\disconnect! + dragCon = nil + upCon\disconnect! + drag = nil + + mouseDrag.Parent = getScreenGuiAncestor scrollbar + + scrollMouseCount = 0 + + scrollUpButton.MouseButton1Down\connect -> + scrollUp! + scrollDownButton.MouseButton1Down\connect -> + scrollDown! + + scrollUpButton.MouseButton1Up\connect -> + scrollStamp = tick! + scrollDownButton.MouseButton1Up\connect -> + scrollStamp = tick! + + scrollbar.MouseButton1Up\connect -> + scrollStamp = tick! + scrollbar.MouseButton1Down\connect (_, y) -> + if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y) + scrollDown y + elseif y < scrollDrag.AbsolutePosition.y + scrollUp y + + frame.ChildAdded\connect -> recalculate nil + frame.ChildRemoved\connect -> recalculate nil + frame.AncestryChanged\connect -> recalculate nil + + frame.Changed\connect (prop) -> + if prop == "AbsoluteSize" + --Wait a heartbeat for it to sync in + recalculate nil + + + frame, scrollUpButton, scrollDownButton, recalculate, scrollbar + +binaryGrow = (min, max, fits) -> + if min > max + return min + + biggestLegal = min + + while min <= max + mid = min + math.floor (max - min) / 2 + if fits(mid) and (not biggestLegal? or biggestLegal < mid) + biggestLegal = mid + --Try growing + min = mid + 1 + else + --Doesn't fit, shrink + max = mid - 1 + + biggestLegal + +binaryShrink = (min, max, fits) -> + if min > max + return min + + smallestLegal = max + + while min <= max + mid = min + math.floor (max - min) / 2 + if fits(mid) and (not smallestLegal? or smallestLegal > mid) + smallestLegal = mid + --It fits, shrink + max = mid - 1 + else + --Doesn't fit, grow + min = mid + 1 + + smallestLegal + +getGuiOwner = (instance) -> + while instance? + if instance\IsA("ScreenGui") or instance\IsA("BillboardGui") + return instance + + instance = instance.Parent + +t.AutoTruncateTextObject = (textLabel) -> + text = textLabel.Text + + fullLabel = textLabel\Clone! + with fullLabel + .Name = "Full#{textLabel.Name}" + .BorderSizePixel = 0 + .BackgroundTransparency = 0 + .Text = text + .TextXAlignment = Enum.TextXAlignment.Center + .Position = UDim2.new 0, -3, 0, 0 + .Size = UDim2.new 0, 100, 1, 0 + .Visible = false + .Parent = textLabel + + local shortText + local mouseEnterConnection + local mouseLeaveConnection + + checkForResize = -> + return if not getGuiOwner(textLabel)? - textLabel = Instance.new "TextLabel" - textLabel.BackgroundTransparency = 1 - textLabel.TextColor3 = Color3.new 1, 1, 1 textLabel.Text = text - textLabel.TextWrap = true - textLabel.TextXAlignment = Enum.TextXAlignment.Left - textLabel.TextYAlignment = Enum.TextYAlignment.Center - textLabel.Font = Enum.Font.Arial - textLabel.FontSize = Enum.FontSize.Size14 - textLabel.Size = UDim2.new(1, 0, 1, 0) + if textLabel.TextFits + --Tear down the rollover if it is active - handleResize = (minSize, maxSize) - size = binaryShrink(minSize, maxSize, function(size) - frame.Size = UDim2.new 0, size, 0, size) - return textLabel.TextFits -) - frame.Size = UDim2.new 0, size, 0, size) - frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2) + mouseEnterConnection?\disconnect! + mouseEnterConnection = nil - frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) - textLabel.Parent = contentFrame + mouseLeaveConnection?\disconnect! + mouseLeaveConnection = nil - return frame - end - - t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) - frame = nil - contentFrame = nil - - imageLabel = Instance.new "ImageLabel" - imageLabel.BackgroundTransparency = 1 - imageLabel.Image = imageAsset - imageLabel.Size = UDim2.new 0, x, 0, y) - imageLabel.Position = UDim2.new 0.5, -x / 2, 0.5, -y / 2) - - handleResize = (minSize, maxSize) - size = binaryShrink(minSize, maxSize, function(size) - return size >= x and size >= y -) - if size >= x and size >= y - imageLabel.Size = UDim2.new 0, x, 0, y) - imageLabel.Position = UDim2.new 0.5, -x / 2, 0.5, -y / 2) - else - if x > y - --X is limiter, so - imageLabel.Size = UDim2.new(1, 0, y / x, 0) - imageLabel.Position = UDim2.new 0, 0, 0.5 - (y / x) / 2, 0) - else - --Y is limiter - imageLabel.Size = UDim2.new(x / y, 0, 1, 0) - imageLabel.Position = UDim2.new 0.5 - (x / y) / 2, 0, 0, 0) - - - size += 50 - frame.Size = UDim2.new 0, size, 0, size) - frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2) - - frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc, giveDoneButton) - imageLabel.Parent = contentFrame - - return frame - end - - t.AddTutorialPage = function(tutorial, tutorialPage) - transitionFrame = tutorial.TransitionFrame - currentPageValue = tutorial.CurrentTutorialPage - - if not tutorial.Buttons.Value - tutorialPage.NextButton.Parent = nil - tutorialPage.PrevButton.Parent = nil - - children = tutorial.Pages\GetChildren! - if children and #children > 0 - tutorialPage.Name = "TutorialPage" .. (#children + 1) - previousPage = children[#children] - if not previousPage\IsA "GuiObject" - error "All elements under Pages must be GuiObjects" - - - if tutorial.Buttons.Value - if previousPage.NextButton.Active - error "NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function" - - previousPage.NextButton.MouseButton1Click\connect -> - TransitionTutorialPages(previousPage, tutorialPage, transitionFrame, currentPageValue) - ) - previousPage.NextButton.Active = true - previousPage.NextButton.Visible = true - - if tutorialPage.PrevButton.Active - error "PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function" - - tutorialPage.PrevButton.MouseButton1Click\connect -> - TransitionTutorialPages(tutorialPage, previousPage, transitionFrame, currentPageValue) - ) - tutorialPage.PrevButton.Active = true - tutorialPage.PrevButton.Visible = true - - - tutorialPage.Parent = tutorial.Pages else - --First child - tutorialPage.Name = "TutorialPage1" - tutorialPage.Parent = tutorial.Pages - end + len = string.len text + textLabel.Text = "#{text}~" - t.CreateSetPanel = - function(userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) - if not userIdsForSets - error "CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids" + --Shrink the text + textSize = binaryGrow 0, len, (pos) -> + textLabel.Text = if pos == 0 + "~" + else + "#{string.sub text, 1, pos}~" - if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" - error( - "CreateSetPanel: userIdsForSets (first arg) is of type " - .. type(userIdsForSets) - .. ", should be of type table or userdata" - ) + textLabel.TextFits - if not objectSelected - error "CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!" + shortText = "#{string.sub text, 1, textSize}~" + textLabel.Text = shortText - if type(objectSelected) ~= "function" - error( - "CreateSetPanel: objectSelected (second arg) is of type " - .. type(objectSelected) - .. ", should be of type function!" - ) + --Make sure the fullLabel fits + if not fullLabel.TextFits + --Already too small, grow it really bit to start + fullLabel.Size = UDim2.new 0, 10000, 1, 0 - if dialogClosed and type(dialogClosed) ~= "function" - error( - "CreateSetPanel: dialogClosed (third arg) is of type " - .. type(dialogClosed) - .. ", should be of type function!" - ) + --Okay, now try to binary shrink it back down + fullLabelSize = binaryShrink textLabel.AbsoluteSize.X, fullLabel.AbsoluteSize.X, (size) -> + fullLabel.Size = UDim2.new 0, size, 1, 0 + fullLabel.TextFits + fullLabel.Size = UDim2.new 0, fullLabelSize + 6, 1, 0 - if showAdminCategories == nil then -- by default, don't show beta sets - showAdminCategories = false + --Now setup the rollover effects, if they are currently off + if not mouseEnterConnection? + mouseEnterConnection = textLabel.MouseEnter\connect -> + fullLabel.ZIndex = textLabel.ZIndex + 1 + fullLabel.Visible = true + --textLabel.Text = "" + if not mouseLeaveConnection? + mouseLeaveConnection = textLabel.MouseLeave\connect -> + fullLabel.Visible = false + --textLabel.Text = shortText - arrayPosition = 1 - insertButtons = {} - insertButtonCons = {} - contents = nil - setGui = nil + textLabel.AncestryChanged\connect checkForResize + textLabel.Changed\connect (prop) -> + if prop == "AbsoluteSize" + checkForResize! - -- used for water selections - waterForceDirection = "NegX" - waterForce = "None" - local waterGui, waterTypeChangedEvent = nil + checkForResize! - Data = {} - Data.CurrentCategory = nil - Data.Category = {} - SetCache = {} + changeText = (newText) -> + text = newText + fullLabel.Text = text + checkForResize! - userCategoryButtons = nil + textLabel, changeText - buttonWidth = 64 - buttonHeight = buttonWidth +TransitionTutorialPages = (fromPage, toPage, transitionFrame, currentPageValue) -> + if fromPage + fromPage.Visible = false + if transitionFrame.Visible == false + transitionFrame.Size = fromPage.Size + transitionFrame.Position = fromPage.Position - SmallThumbnailUrl = nil - LargeThumbnailUrl = nil - BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() + elseif transitionFrame.Visible == false + transitionFrame.Size = UDim2.new 0, 50, 0, 50 + transitionFrame.Position = UDim2.new 0.5, -25, 0.5, -25 - if useAssetVersionId - LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=" - SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" + transitionFrame.Visible = true + currentPageValue.Value = nil + + local newSize, newPosition + if toPage + --Make it visible so it resizes + toPage.Visible = true + + newSize = toPage.Size + newPosition = toPage.Position + + toPage.Visible = false + else + newSize = UDim2.new 0, 50, 0, 50 + newPosition = UDim2.new 0.5, -25, 0.5, -25 + + transitionFrame\TweenSizeAndPosition( + newSize, + newPosition, + Enum.EasingDirection.InOut, + Enum.EasingStyle.Quad, + 0.3, + true, + (state) -> + if state == Enum.TweenStatus.Completed + transitionFrame.Visible = false + if toPage + toPage.Visible = true + currentPageValue.Value = toPage + ) + +t.CreateTutorial = (name, tutorialKey, createButtons) -> + frame = New "Frame", "Tutorial-#{name}" + BackgroundTransparency: 1 + Size: UDim2.new 0.6, 0, 0.6, 0 + Position: UDim2.new 0.2, 0, 0.2, 0 + + * New "Frame", "TransitionFrame" + Style: Enum.FrameStyle.RobloxRound + Size: UDim2.new 0.6, 0, 0.6, 0 + Position: UDim2.new 0.2, 0, 0.2, 0 + Visible: false + + * New "ObjectValue", "CurrentTutorialPage" + Value: nil + + * New "BoolValue", "Buttons" + Value: createButtons + + * New "Frame", "Pages" + BackgroundTransparency: 1 + Size: UDim2.new 1, 0, 1, 0 + + { -- Destructure + TransitionFrame: transitionFrame + CurrentTutorialPage: currentPageValue + Pages: pages + } = frame + + getVisiblePageAndHideOthers = -> + local visiblePage + children = pages\GetChildren! + if children + for _, child in ipairs children + if child.Visible + if visiblePage + child.Visible = false + else + visiblePage = child + + visiblePage + + showTutorial = (alwaysShow) -> + if alwaysShow or UserSettings!.GameSettings\GetTutorialState(tutorialKey) == false + print "Showing tutorial-", tutorialKey + currentTutorialPage = getVisiblePageAndHideOthers! + + firstPage = pages\FindFirstChild "TutorialPage1" + if firstPage + TransitionTutorialPages currentTutorialPage, firstPage, transitionFrame, currentPageValue else - LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=" - SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" + error "Could not find TutorialPage1" - drillDownSetZIndex = (parent, index) - children = parent\GetChildren! - for i = 1, #children - if children[i]\IsA "GuiObject" - children[i].ZIndex = index + dismissTutorial = -> + currentTutorialPage = getVisiblePageAndHideOthers! - drillDownSetZIndex(children[i], index) + if currentTutorialPage + TransitionTutorialPages currentTutorialPage, nil, transitionFrame, currentPageValue + + UserSettings!.GameSettings\SetTutorialState tutorialKey, true + gotoPage = (pageNum) -> + page = pages\FindFirstChild "TutorialPage#{pageNum}" + currentTutorialPage = getVisiblePageAndHideOthers! + TransitionTutorialPages currentTutorialPage, page, transitionFrame, currentPageValue + + frame, showTutorial, dismissTutorial, gotoPage + +CreateBasicTutorialPage = (name, handleResize, skipTutorial, giveDoneButton) -> + frame = New "Frame", "TutorialPage" + Style: Enum.FrameStyle.RobloxRound + Size: UDim2.new 0.6, 0, 0.6, 0 + Position: UDim2.new 0.2, 0, 0.2, 0 + Visible: false + + * New "TextLabel", "Header" + Text: name + BackgroundTransparency: 1 + FontSize: Enum.FontSize.Size24 + Font: Enum.Font.ArialBold + TextColor3: Color3.new 1, 1, 1 + TextXAlignment: Enum.TextXAlignment.Center + TextWrap: true + Size: UDim2.new 1, -55, 0, 22 + Position: UDim2.new 0, 0, 0, 0 + + * New "ImageButton", "SkipButton" + AutoButtonColor: false + BackgroundTransparency: 1 + Image: "rbxasset://textures/ui/closeButton.png" + Size: UDim2.new 0, 25, 0, 25 + Position: UDim2.new 1, -25, 0, 0 + + * New "TextButton", "NextButton" + Text: "Next" + TextColor3: Color3.new 1, 1, 1 + Font: Enum.Font.Arial + FontSize: Enum.FontSize.Size18 + Style: Enum.ButtonStyle.RobloxButtonDefault + Size: UDim2.new 0, 80, 0, 32 + Position: UDim2.new 0.5, 5, 1, -32 + Active: false + Visible: false + + * New "TextButton", "PrevButton" + Text: "Previous" + TextColor3: Color3.new 1, 1, 1 + Font: Enum.Font.Arial + FontSize: Enum.FontSize.Size18 + Style: Enum.ButtonStyle.RobloxButton + Size: UDim2.new 0, 80, 0, 32 + Position: UDim2.new 0.5, -85, 1, -32 + Active: false + Visible: false + + * New "Frame", "ContentFrame" + BackgroundTransparency: 1 + Position: UDim2.new 0, 0, 0, 25 + + innerFrame = frame.ContentFrame + + with frame.SkipButton + .MouseButton1Click\connect -> + skipTutorial! + .MouseEnter\connect -> + .Image = "rbxasset://textures/ui/closeButton_dn.png" + .MouseLeave\connect -> + .Image = "rbxasset://textures/ui/closeButton.png" + + if giveDoneButton + doneButton = New "TextButton", "DoneButton" + Style: Enum.ButtonStyle.RobloxButtonDefault + Text: "Done" + TextColor3: Color3.new 1, 1, 1 + Font: Enum.Font.ArialBold + FontSize: Enum.FontSize.Size18 + Size: UDim2.new 0, 100, 0, 50 + Position: UDim2.new 0.5, -50, 1, -50 + Parent: frame + + if skipTutorial + doneButton.MouseButton1Click\connect -> + skipTutorial! + + innerFrame.Size = if giveDoneButton + UDim2.new 1, 0, 1, -75 + else + UDim2.new 1, 0, 1, -22 + + local parentConnection + + basicHandleResize = -> + if frame.Visible and frame.Parent + maxSize = math.min frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y + handleResize 200, maxSize + + frame.Changed\connect (prop) -> + if prop == "Parent" + + parentConnection?\disconnect! + parentConnection = nil + + if frame.Parent and frame.Parent\IsA "GuiObject" + parentConnection = frame.Parent.Changed\connect (parentProp) -> + if parentProp == "AbsoluteSize" + wait! + basicHandleResize! + basicHandleResize! + + if prop == "Visible" + basicHandleResize! + + frame, innerFrame + +t.CreateTextTutorialPage = (name, text, skipTutorialFunc) -> + local frame + + textLabel = New "TextLabel" + BackgroundTransparency: 1 + TextColor3: Color3.new 1, 1, 1 + Text: text + TextWrap: true + TextXAlignment: Enum.TextXAlignment.Left + TextYAlignment: Enum.TextYAlignment.Center + Font: Enum.Font.Arial + FontSize: Enum.FontSize.Size14 + Size: UDim2.new 1, 0, 1, 0 + + handleResize = (minSize, maxSize) -> + size = binaryShrink minSize, maxSize, (size) -> + frame.Size = UDim2.new 0, size, 0, size + textLabel.TextFits + + frame.Size = UDim2.new 0, size, 0, size + frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2 + + frame, contentFrame = CreateBasicTutorialPage name, handleResize, skipTutorialFunc + textLabel.Parent = contentFrame + + frame + +t.CreateImageTutorialPage = (name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) -> + local frame, contentFrame + + imageLabel = New "ImageLabel" + BackgroundTransparency: 1 + Image: imageAsset + Size: UDim2.new 0, x, 0, y + Position: UDim2.new 0.5, -x / 2, 0.5, -y / 2 + + handleResize = (minSize, maxSize) -> + size = binaryShrink minSize, maxSize, (size) -> + size >= x and size >= y + + if size >= x and size >= y + imageLabel.Size = UDim2.new 0, x, 0, y + imageLabel.Position = UDim2.new 0.5, -x / 2, 0.5, -y / 2 + else + imageLabel.Size, imageLabel.Position = if x > y + --X is limiter, so + UDim2.new(1, 0, y / x, 0), UDim2.new(0, 0, 0.5 - (y / x) / 2, 0) + else + --Y is limiter + UDim2.new(x / y, 0, 1, 0), UDim2.new(0.5 - (x / y) / 2, 0, 0, 0) + + + size += 50 + frame.Size = UDim2.new 0, size, 0, size + frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2 + + frame, contentFrame = CreateBasicTutorialPage name, handleResize, skipTutorialFunc, giveDoneButton + imageLabel.Parent = contentFrame + + frame + +t.AddTutorialPage = (tutorial, tutorialPage) -> + transitionFrame = tutorial.TransitionFrame + currentPageValue = tutorial.CurrentTutorialPage + + if not tutorial.Buttons.Value + tutorialPage.NextButton.Parent = tutorialPage.PrevButton.Parent = nil + + children = tutorial.Pages\GetChildren! + if children and #children > 0 + tutorialPage.Name = "TutorialPage#{#children + 1}" + previousPage = children[#children] + if not previousPage\IsA "GuiObject" + error "All elements under Pages must be GuiObjects" + + if tutorial.Buttons.Value + if previousPage.NextButton.Active + error "NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function" + + previousPage.NextButton.MouseButton1Click\connect -> + TransitionTutorialPages previousPage, tutorialPage, transitionFrame, currentPageValue + + previousPage.NextButton.Active = previousPage.NextButton.Visible = true + + if tutorialPage.PrevButton.Active + error "PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function" + + tutorialPage.PrevButton.MouseButton1Click\connect -> + TransitionTutorialPages tutorialPage, previousPage, transitionFrame, currentPageValue + + tutorialPage.PrevButton.Active = tutorialPage.PrevButton.Visible = true + + + tutorialPage.Parent = tutorial.Pages + else + --First child + tutorialPage.Name = "TutorialPage1" + tutorialPage.Parent = tutorial.Pages + +t.CreateSetPanel = (userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) -> + if not userIdsForSets + error "CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids" + + if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" + error "CreateSetPanel: userIdsForSets (first arg) is of type #{type userIdsForSets}, should be of type table or userdata" + + if not objectSelected + error "CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!" + + if type(objectSelected) ~= "function" + error "CreateSetPanel: objectSelected (second arg) is of type #{type objectSelected}, should be of type function!" + + if dialogClosed and type(dialogClosed) ~= "function" + error "CreateSetPanel: dialogClosed (third arg) is of type #{type dialogClosed}, should be of type function!" + + if not showAdminCategories? -- by default, don't show beta sets + showAdminCategories = false + + arrayPosition = 1 + insertButtons = {} + insertButtonCons = {} + local contents, setGui + + -- used for water selections + waterForceDirection = "NegX" + waterForce = "None" + local waterGui, waterTypeChangedEvent + + Data = {} + Data.CurrentCategory = nil + Data.Category = {} + SetCache = {} + + local userCategoryButtons + + buttonWidth = 64 + buttonHeight = buttonWidth + + local SmallThumbnailUrl, LargeThumbnailUrl + BaseUrl = game\GetService("ContentProvider").BaseUrl\lower! + + LargeThumbnailUrl, SmallThumbnailUrl = if useAssetVersionId + "#{BaseUrl}Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=", "#{BaseUrl}Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" + else + "#{BaseUrl}Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=", "#{BaseUrl}Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" + + + drillDownSetZIndex = (parent, index) -> + children = parent\GetChildren! + for i = 1, #children + if children[i]\IsA "GuiObject" + children[i].ZIndex = index + + drillDownSetZIndex children[i], index + + -- for terrain stamping + local currTerrainDropDownFrame + terrainShapes = + * "Block" + * "Vertical Ramp" + * "Corner Wedge" + * "Inverse Corner Wedge" + * "Horizontal Ramp" + * "Auto-Wedge" + terrainShapeMap = {} + + for i = 1, #terrainShapes + terrainShapeMap[terrainShapes[i]] = i - 1 + + terrainShapeMap[terrainShapes[#terrainShapes]] = 6 + + createWaterGui = -> + waterForceDirections = { "NegX", "X", "NegY", "Y", "NegZ", "Z" } + waterForces = { "None", "Small", "Medium", "Strong", "Max" } + + waterFrame = New "Frame", "WaterFrame" + Style: Enum.FrameStyle.RobloxSquare + Size: UDim2.new 0, 150, 0, 110 + Visible: false + + waterForceLabel = New "TextLabel", "WaterForceLabel" + BackgroundTransparency: 1 + Size: UDim2.new 1, 0, 0, 12 + Font: Enum.Font.ArialBold + FontSize: Enum.FontSize.Size12 + TextColor3: Color3.new 1, 1, 1 + TextXAlignment: Enum.TextXAlignment.Left + Text: "Water Force" + Parent: waterFrame + + waterForceDirLabel = waterForceLabel\Clone! + with waterForceDirLabel + .Name = "WaterForceDirectionLabel" + .Text = "Water Force Direction" + .Position = UDim2.new 0, 0, 0, 50 + .Parent = waterFrame + + waterTypeChangedEvent = New "BindableEvent", "WaterTypeChangedEvent" + Parent: waterFrame + + waterForceDirectionSelectedFunc = (newForceDirection) -> + waterForceDirection = newForceDirection + waterTypeChangedEvent\Fire { waterForce, waterForceDirection } + + waterForceSelectedFunc = (newForce) -> + waterForce = newForce + waterTypeChangedEvent\Fire { waterForce, waterForceDirection } + + + waterForceDirectionDropDown, forceWaterDirectionSelection = t.CreateDropDownMenu waterForceDirections, waterForceDirectionSelectedFunc + waterForceDirectionDropDown.Size = UDim2.new 1, 0, 0, 25 + waterForceDirectionDropDown.Position = UDim2.new 0, 0, 1, 3 + forceWaterDirectionSelection "NegX" + waterForceDirectionDropDown.Parent = waterForceDirLabel + + waterForceDropDown, forceWaterForceSelection = t.CreateDropDownMenu waterForces, waterForceSelectedFunc + forceWaterForceSelection "None" + waterForceDropDown.Size = UDim2.new 1, 0, 0, 25 + waterForceDropDown.Position = UDim2.new 0, 0, 1, 3 + waterForceDropDown.Parent = waterForceLabel + + waterFrame, waterTypeChangedEvent + + + -- Helper Function that contructs gui elements + createSetGui = -> + setGui = Instance.new "ScreenGui" + setGui.Name = "SetGui" + + setPanel = New "Frame", "SetPanel" + Active: true + BackgroundTransparency: 1 + Position: position or UDim2.new 0.2, 29, 0.1, 24 + Size: size or UDim2.new 0.6, -58, 0.64, 0 + Style: Enum.FrameStyle.RobloxRound + ZIndex: 6 + Parent: setGui + + * New "TextButton", "CancelButton" + Position: UDim2.new 1, -32, 0, -2 + Size: UDim2.new 0, 34, 0, 34 + Style: Enum.ButtonStyle.RobloxButtonDefault + ZIndex: 6 + Text: "" + Modal: true + + * New "ImageLabel", "CancelImage" + BackgroundTransparency: 1 + Image: "http://www.roblox.com/asset?id=54135717" + Position: UDim2.new 0, -2, 0, -2 + Size: UDim2.new 0, 16, 0, 16 + ZIndex: 6 + + * New "Frame", "ItemPreview" + BackgroundTransparency: 1 + Position: UDim2.new 0.8, 5, 0.085, 0 + Size: UDim2.new 0.21, 0, 0.9, 0 + ZIndex: 6 + + * New "ImageLabel", "LargePreview" + BackgroundTransparency: 1 + Image: "" + Size: UDim2.new 1, 0, 0, 170 + ZIndex: 6 + + * New "Frame", "TextPanel" + BackgroundTransparency: 1 + Position: UDim2.new 0, 0, 0.45, 0 + Size: UDim2.new 1, 0, 0.55, 0 + ZIndex: 6 + + * New "TextLabel", "RolloverText" + BackgroundTransparency: 1 + Size: UDim2.new 1, 0, 0, 48 + ZIndex: 6 + Font: Enum.Font.ArialBold + FontSize: Enum.FontSize.Size24 + Text: "" + TextColor3: Color3.new 1, 1, 1 + TextWrap: true + TextXAlignment: Enum.TextXAlignment.Left + TextYAlignment: Enum.TextYAlignment.Top + + * New "Frame", "Sets" + BackgroundTransparency: 1 + Position: UDim2.new 0, 0, 0, 5 + Size: UDim2.new 0.23, 0, 1, -5 + ZIndex: 6 + + * New "Frame", "Line" + BackgroundColor3: Color3.new 1, 1, 1 + BackgroundTransparency: 0.7 + BorderSizePixel: 0 + Position: UDim2.new 1, -3, 0.06, 0 + Size: UDim2.new 0, 3, 0.9, 0 + ZIndex: 6 + + * New "TextLabel", "SetsHeader" + BackgroundTransparency: 1 + Size: UDim2.new 0, 47, 0, 24 + ZIndex: 6 + Font: Enum.Font.ArialBold + FontSize: Enum.FontSize.Size24 + Text: "Sets" + TextColor3: Color3.new 1, 1, 1 + TextXAlignment: Enum.TextXAlignment.Left + TextYAlignment: Enum.TextYAlignment.Top + + setsLists, controlFrame = t.CreateTrueScrollingFrame! + with setsLists + .Size = UDim2.new 1, -6, 0.94, 0 + .Position = UDim2.new 0, 0, 0.06, 0 + .BackgroundTransparency = 1 + .Name = "SetsLists" + .ZIndex = 6 + .Parent = setPanel.Sets + drillDownSetZIndex controlFrame, 7 + + setGui + + createSetButton = (text) -> + setButton = New "TextButton" + Text: text or "" + AutoButtonColor: false + BackgroundTransparency: 1 + BackgroundColor3: Color3.new 1, 1, 1 + BorderSizePixel: 0 + Size: UDim2.new 1, -5, 0, 18 + ZIndex: 6 + Visible: false + Font: Enum.Font.Arial + FontSize: Enum.FontSize.Size18 + TextColor3: Color3.new 1, 1, 1 + TextXAlignment: Enum.TextXAlignment.Left + + setButton + + buildSetButton = (name, setId, _, _, _) -> + button = createSetButton name + with button + .Text = name + .Name = "SetButton" + .Visible = true + + New "IntValue", "SetId" + Value: setId + Parent: button + + New "StringValue", "SetName" + Value: name + Parent: button + + button + + processCategory = (sets) -> + setButtons = {} + numSkipped = 0 + for i = 1, #sets + if not showAdminCategories and sets[i].Name == "Beta" + numSkipped += 1 + else + setButtons[i - numSkipped] = buildSetButton sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets + + setButtons + + handleResize = -> + wait! -- neccessary to insure heartbeat happened + + with setGui.SetPanel.ItemPreview + .LargePreview.Size = UDim2.new 1, 0, 0, .AbsoluteSize.X + .LargePreview.Position = UDim2.new 0.5, -.LargePreview.AbsoluteSize.X / 2, 0, 0 + .TextPanel.Position = UDim2.new 0, 0, 0, .LargePreview.AbsoluteSize.Y + .TextPanel.Size = UDim2.new 1, 0, 0, .AbsoluteSize.Y - .LargePreview.AbsoluteSize.Y + + makeInsertAssetButton = -> + insertAssetButtonExample = New "Frame", "InsertAssetButtonExample" + Position: UDim2.new 0, 128, 0, 64 + Size: UDim2.new 0, 64, 0, 64 + BackgroundTransparency: 1 + ZIndex: 6 + Visible: false + + * New "IntValue", "AssetId" + Value: 0 + + * New "StringValue", "AssetName" + Value: "" + + * New "TextButton", "Button" + Text: "" + Style: Enum.ButtonStyle.RobloxButton + Position: UDim2.new 0.025, 0, 0.025, 0 + Size: UDim2.new 0.95, 0, 0.95, 0 + ZIndex: 6 + + * New "ImageLabel", "ButtonImage" + Image: "" + Position: UDim2.new 0, -7, 0, -7 + Size: UDim2.new 1, 14, 1, 14 + BackgroundTransparency: 1 + ZIndex: 7 + + with insertAssetButtonExample.button.ButtonImage\clone! + .Name = "ConfigIcon" + .Visible = false + .Position = UDim2.new 1, -23, 1, -24 + .Size = UDim2.new 0, 16, 0, 16 + .Image = "" + .ZIndex = 6 + .Parent = insertAssetButtonExample + + insertAssetButtonExample + + showLargePreview = (insertButton) -> + if insertButton\FindFirstChild "AssetId" + delay 0, -> + game\GetService("ContentProvider")\Preload LargeThumbnailUrl .. "#{insertButton.AssetId.Value}" + setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl .. "#{insertButton.AssetId.Value}" + + if insertButton\FindFirstChild "AssetName" + setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value + + selectTerrainShape = (shape) -> + if currTerrainDropDownFrame + objectSelected( + tostring(currTerrainDropDownFrame.AssetName.Value), + tonumber(currTerrainDropDownFrame.AssetId.Value), + shape + ) + + createTerrainTypeButton = (name, parent) -> + dropDownTextButton = New "TextButton", "#{name}Button" + Font: Enum.Font.ArialBold + FontSize: Enum.FontSize.Size14 + BorderSizePixel: 0 + TextColor3: Color3.new 1, 1, 1 + Text: name + TextXAlignment: Enum.TextXAlignment.Left + BackgroundTransparency: 1 + ZIndex: parent.ZIndex + 1 + Size: UDim2.new 0, parent.Size.X.Offset - 2, 0, 16 + Position: UDim2.new 0, 1, 0, 0 + + with dropDownTextButton + .MouseEnter\connect -> + .BackgroundTransparency = 0 + .TextColor3 = Color3.new 0, 0, 0 + + .MouseLeave\connect -> + .BackgroundTransparency = 1 + .TextColor3 = Color3.new 1, 1, 1 + + .MouseButton1Click\connect -> + .BackgroundTransparency = 1 + .TextColor3 = Color3.new 1, 1, 1 + if .Parent and .Parent\IsA "GuiObject" + .Parent.Visible = false + + selectTerrainShape terrainShapeMap[.Text] + + dropDownTextButton + + createTerrainDropDownMenu = (zIndex) -> + dropDown = New "Frame", "TerrainDropDown" + BackgroundColor3: Color3.new 0, 0, 0 + BorderColor3: Color3.new 1, 0, 0 + Size: UDim2.new 0, 200, 0, 0 + Visible: false + ZIndex: zIndex + Parent: setGui - -- for terrain stamping - currTerrainDropDownFrame = nil - local terrainShapes = - { "Block", "Vertical Ramp", "Corner Wedge", "Inverse Corner Wedge", "Horizontal Ramp", "Auto-Wedge" } - terrainShapeMap = {} for i = 1, #terrainShapes - terrainShapeMap[terrainShapes[i] ] = i - 1 + shapeButton = createTerrainTypeButton terrainShapes[i], dropDown + shapeButton.Position = UDim2.new 0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset + shapeButton.Parent = dropDown + dropDown.Size = UDim2.new 0, 200, 0, dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset - terrainShapeMap[terrainShapes[#terrainShapes] ] = 6 - - createWaterGui = () - waterForceDirections = { "NegX", "X", "NegY", "Y", "NegZ", "Z" } - waterForces = { "None", "Small", "Medium", "Strong", "Max" } - - waterFrame = Instance.new "Frame" - waterFrame.Name = "WaterFrame" - waterFrame.Style = Enum.FrameStyle.RobloxSquare - waterFrame.Size = UDim2.new 0, 150, 0, 110) - waterFrame.Visible = false - - waterForceLabel = Instance.new "TextLabel" - waterForceLabel.Name = "WaterForceLabel" - waterForceLabel.BackgroundTransparency = 1 - waterForceLabel.Size = UDim2.new(1, 0, 0, 12) - waterForceLabel.Font = Enum.Font.ArialBold - waterForceLabel.FontSize = Enum.FontSize.Size12 - waterForceLabel.TextColor3 = Color3.new 1, 1, 1 - waterForceLabel.TextXAlignment = Enum.TextXAlignment.Left - waterForceLabel.Text = "Water Force" - waterForceLabel.Parent = waterFrame - - waterForceDirLabel = waterForceLabel\Clone! - waterForceDirLabel.Name = "WaterForceDirectionLabel" - waterForceDirLabel.Text = "Water Force Direction" - waterForceDirLabel.Position = UDim2.new 0, 0, 0, 50) - waterForceDirLabel.Parent = waterFrame - - waterTypeChangedEvent = Instance.new "BindableEvent" - waterTypeChangedEvent.Name = "WaterTypeChangedEvent" - waterTypeChangedEvent.Parent = waterFrame - - waterForceDirectionSelectedFunc = function(newForceDirection) - waterForceDirection = newForceDirection - waterTypeChangedEvent:Fire { waterForce, waterForceDirection } - - waterForceSelectedFunc = function(newForce) - waterForce = newForce - waterTypeChangedEvent:Fire { waterForce, waterForceDirection } - - - local waterForceDirectionDropDown, forceWaterDirectionSelection = - t.CreateDropDownMenu(waterForceDirections, waterForceDirectionSelectedFunc) - waterForceDirectionDropDown.Size = UDim2.new(1, 0, 0, 25) - waterForceDirectionDropDown.Position = UDim2.new 0, 0, 1, 3) - forceWaterDirectionSelection "NegX" - waterForceDirectionDropDown.Parent = waterForceDirLabel - - local waterForceDropDown, forceWaterForceSelection = - t.CreateDropDownMenu(waterForces, waterForceSelectedFunc) - forceWaterForceSelection "None" - waterForceDropDown.Size = UDim2.new(1, 0, 0, 25) - waterForceDropDown.Position = UDim2.new 0, 0, 1, 3) - waterForceDropDown.Parent = waterForceLabel - - return waterFrame, waterTypeChangedEvent - - - -- Helper Function that contructs gui elements - createSetGui = () - setGui = Instance.new "ScreenGui" - setGui.Name = "SetGui" - - setPanel = Instance.new "Frame" - setPanel.Name = "SetPanel" - setPanel.Active = true - setPanel.BackgroundTransparency = 1 - if position - setPanel.Position = position - else - setPanel.Position = UDim2.new 0.2, 29, 0.1, 24) - - if size - setPanel.Size = size - else - setPanel.Size = UDim2.new 0.6, -58, 0.64, 0) - - setPanel.Style = Enum.FrameStyle.RobloxRound - setPanel.ZIndex = 6 - setPanel.Parent = setGui - - -- Children of SetPanel - itemPreview = Instance.new "Frame" - itemPreview.Name = "ItemPreview" - itemPreview.BackgroundTransparency = 1 - itemPreview.Position = UDim2.new 0.8, 5, 0.085, 0) - itemPreview.Size = UDim2.new 0.21, 0, 0.9, 0) - itemPreview.ZIndex = 6 - itemPreview.Parent = setPanel - - -- Children of ItemPreview - textPanel = Instance.new "Frame" - textPanel.Name = "TextPanel" - textPanel.BackgroundTransparency = 1 - textPanel.Position = UDim2.new 0, 0, 0.45, 0) - textPanel.Size = UDim2.new(1, 0, 0.55, 0) - textPanel.ZIndex = 6 - textPanel.Parent = itemPreview - - -- Children of TextPanel - rolloverText = Instance.new "TextLabel" - rolloverText.Name = "RolloverText" - rolloverText.BackgroundTransparency = 1 - rolloverText.Size = UDim2.new(1, 0, 0, 48) - rolloverText.ZIndex = 6 - rolloverText.Font = Enum.Font.ArialBold - rolloverText.FontSize = Enum.FontSize.Size24 - rolloverText.Text = "" - rolloverText.TextColor3 = Color3.new 1, 1, 1 - rolloverText.TextWrap = true - rolloverText.TextXAlignment = Enum.TextXAlignment.Left - rolloverText.TextYAlignment = Enum.TextYAlignment.Top - rolloverText.Parent = textPanel - - largePreview = Instance.new "ImageLabel" - largePreview.Name = "LargePreview" - largePreview.BackgroundTransparency = 1 - largePreview.Image = "" - largePreview.Size = UDim2.new(1, 0, 0, 170) - largePreview.ZIndex = 6 - largePreview.Parent = itemPreview - - sets = Instance.new "Frame" - sets.Name = "Sets" - sets.BackgroundTransparency = 1 - sets.Position = UDim2.new 0, 0, 0, 5) - sets.Size = UDim2.new 0.23, 0, 1, -5) - sets.ZIndex = 6 - sets.Parent = setPanel - - -- Children of Sets - line = Instance.new "Frame" - line.Name = "Line" - line.BackgroundColor3 = Color3.new 1, 1, 1 - line.BackgroundTransparency = 0.7 - line.BorderSizePixel = 0 - line.Position = UDim2.new(1, -3, 0.06, 0) - line.Size = UDim2.new 0, 3, 0.9, 0) - line.ZIndex = 6 - line.Parent = sets - - local setsLists, controlFrame = t.CreateTrueScrollingFrame() - setsLists.Size = UDim2.new(1, -6, 0.94, 0) - setsLists.Position = UDim2.new 0, 0, 0.06, 0) - setsLists.BackgroundTransparency = 1 - setsLists.Name = "SetsLists" - setsLists.ZIndex = 6 - setsLists.Parent = sets - drillDownSetZIndex(controlFrame, 7) - - setsHeader = Instance.new "TextLabel" - setsHeader.Name = "SetsHeader" - setsHeader.BackgroundTransparency = 1 - setsHeader.Size = UDim2.new 0, 47, 0, 24) - setsHeader.ZIndex = 6 - setsHeader.Font = Enum.Font.ArialBold - setsHeader.FontSize = Enum.FontSize.Size24 - setsHeader.Text = "Sets" - setsHeader.TextColor3 = Color3.new 1, 1, 1 - setsHeader.TextXAlignment = Enum.TextXAlignment.Left - setsHeader.TextYAlignment = Enum.TextYAlignment.Top - setsHeader.Parent = sets - - cancelButton = Instance.new "TextButton" - cancelButton.Name = "CancelButton" - cancelButton.Position = UDim2.new(1, -32, 0, -2) - cancelButton.Size = UDim2.new 0, 34, 0, 34) - cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault - cancelButton.ZIndex = 6 - cancelButton.Text = "" - cancelButton.Modal = true - cancelButton.Parent = setPanel - - -- Children of Cancel Button - cancelImage = Instance.new "ImageLabel" - cancelImage.Name = "CancelImage" - cancelImage.BackgroundTransparency = 1 - cancelImage.Image = "http://www.roblox.com/asset?id=54135717" - cancelImage.Position = UDim2.new 0, -2, 0, -2) - cancelImage.Size = UDim2.new 0, 16, 0, 16) - cancelImage.ZIndex = 6 - cancelImage.Parent = cancelButton - - return setGui - - - createSetButton = (text) - setButton = Instance.new "TextButton" - - if text - setButton.Text = text - else - setButton.Text = "" - - - setButton.AutoButtonColor = false - setButton.BackgroundTransparency = 1 - setButton.BackgroundColor3 = Color3.new 1, 1, 1 - setButton.BorderSizePixel = 0 - setButton.Size = UDim2.new(1, -5, 0, 18) - setButton.ZIndex = 6 - setButton.Visible = false - setButton.Font = Enum.Font.Arial - setButton.FontSize = Enum.FontSize.Size18 - setButton.TextColor3 = Color3.new 1, 1, 1 - setButton.TextXAlignment = Enum.TextXAlignment.Left - - return setButton - - - buildSetButton = (name, setId, _, _, _) - button = createSetButton(name) - button.Text = name - button.Name = "SetButton" - button.Visible = true - - setValue = Instance.new "IntValue" - setValue.Name = "SetId" - setValue.Value = setId - setValue.Parent = button - - setName = Instance.new "StringValue" - setName.Name = "SetName" - setName.Value = name - setName.Parent = button - - return button - - - processCategory = (sets) - setButtons = {} - numSkipped = 0 - for i = 1, #sets - if not showAdminCategories and sets[i].Name == "Beta" - numSkipped += 1 - else - setButtons[i - numSkipped] = - buildSetButton(sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets) - - - return setButtons - - - handleResize = () - wait! -- neccessary to insure heartbeat happened - - itemPreview = setGui.SetPanel.ItemPreview - - itemPreview.LargePreview.Size = UDim2.new(1, 0, 0, itemPreview.AbsoluteSize.X) - itemPreview.LargePreview.Position = UDim2.new 0.5, -itemPreview.LargePreview.AbsoluteSize.X / 2, 0, 0) - itemPreview.TextPanel.Position = UDim2.new 0, 0, 0, itemPreview.LargePreview.AbsoluteSize.Y) - itemPreview.TextPanel.Size = - UDim2.new(1, 0, 0, itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y) - - - makeInsertAssetButton = () - insertAssetButtonExample = Instance.new "Frame" - insertAssetButtonExample.Name = "InsertAssetButtonExample" - insertAssetButtonExample.Position = UDim2.new 0, 128, 0, 64) - insertAssetButtonExample.Size = UDim2.new 0, 64, 0, 64) - insertAssetButtonExample.BackgroundTransparency = 1 - insertAssetButtonExample.ZIndex = 6 - insertAssetButtonExample.Visible = false - - assetId = Instance.new "IntValue" - assetId.Name = "AssetId" - assetId.Value = 0 - assetId.Parent = insertAssetButtonExample - - assetName = Instance.new "StringValue" - assetName.Name = "AssetName" - assetName.Value = "" - assetName.Parent = insertAssetButtonExample - - button = Instance.new "TextButton" - button.Name = "Button" - button.Text = "" - button.Style = Enum.ButtonStyle.RobloxButton - button.Position = UDim2.new 0.025, 0, 0.025, 0) - button.Size = UDim2.new 0.95, 0, 0.95, 0) - button.ZIndex = 6 - button.Parent = insertAssetButtonExample - - buttonImage = Instance.new "ImageLabel" - buttonImage.Name = "ButtonImage" - buttonImage.Image = "" - buttonImage.Position = UDim2.new 0, -7, 0, -7) - buttonImage.Size = UDim2.new(1, 14, 1, 14) - buttonImage.BackgroundTransparency = 1 - buttonImage.ZIndex = 7 - buttonImage.Parent = button - - configIcon = buttonImage\clone! - configIcon.Name = "ConfigIcon" - configIcon.Visible = false - configIcon.Position = UDim2.new(1, -23, 1, -24) - configIcon.Size = UDim2.new 0, 16, 0, 16) - configIcon.Image = "" - configIcon.ZIndex = 6 - configIcon.Parent = insertAssetButtonExample - - return insertAssetButtonExample - - - showLargePreview = (insertButton) - if insertButton:FindFirstChild "AssetId" - delay(0, function() - game:GetService("ContentProvider"):Preload( - LargeThumbnailUrl .. tostring(insertButton.AssetId.Value) - ) - setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl - .. tostring(insertButton.AssetId.Value) - ) - - if insertButton:FindFirstChild "AssetName" - setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value - - - - selectTerrainShape = (shape) - if currTerrainDropDownFrame - objectSelected( - tostring(currTerrainDropDownFrame.AssetName.Value), - tonumber(currTerrainDropDownFrame.AssetId.Value), - shape - ) - - - - createTerrainTypeButton = (name, parent) - dropDownTextButton = Instance.new "TextButton" - dropDownTextButton.Name = name .. "Button" - dropDownTextButton.Font = Enum.Font.ArialBold - dropDownTextButton.FontSize = Enum.FontSize.Size14 - dropDownTextButton.BorderSizePixel = 0 - dropDownTextButton.TextColor3 = Color3.new 1, 1, 1 - dropDownTextButton.Text = name - dropDownTextButton.TextXAlignment = Enum.TextXAlignment.Left - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.ZIndex = parent.ZIndex + 1 - dropDownTextButton.Size = UDim2.new 0, parent.Size.X.Offset - 2, 0, 16) - dropDownTextButton.Position = UDim2.new 0, 1, 0, 0) - - dropDownTextButton.MouseEnter\connect -> - dropDownTextButton.BackgroundTransparency = 0 - dropDownTextButton.TextColor3 = Color3.new 0, 0, 0 - ) - - dropDownTextButton.MouseLeave\connect -> - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new 1, 1, 1 - ) - - dropDownTextButton.MouseButton1Click\connect -> - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new 1, 1, 1 - if dropDownTextButton.Parent and dropDownTextButton.Parent\IsA "GuiObject" - dropDownTextButton.Parent.Visible = false - - selectTerrainShape(terrainShapeMap[dropDownTextButton.Text]) - ) - - return dropDownTextButton - - - createTerrainDropDownMenu = (zIndex) - dropDown = Instance.new "Frame" - dropDown.Name = "TerrainDropDown" - dropDown.BackgroundColor3 = Color3.new 0, 0, 0 - dropDown.BorderColor3 = Color3.new(1, 0, 0) - dropDown.Size = UDim2.new 0, 200, 0, 0) + dropDown.MouseLeave\connect -> dropDown.Visible = false - dropDown.ZIndex = zIndex - dropDown.Parent = setGui - for i = 1, #terrainShapes - shapeButton = createTerrainTypeButton(terrainShapes[i], dropDown) - shapeButton.Position = UDim2.new 0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset) - shapeButton.Parent = dropDown - dropDown.Size = UDim2.new 0, 200, 0, dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset) + createDropDownMenuButton = (parent) -> + dropDownButton = New "ImageButton" + Name: "DropDownButton" + Image: "http://www.roblox.com/asset/?id=67581509" + BackgroundTransparency: 1 + Size: UDim2.new 0, 16, 0, 16 + Position: UDim2.new 1, -24, 0, 6 + ZIndex: parent.ZIndex + 2 + Parent: parent + if not setGui\FindFirstChild "TerrainDropDown" + createTerrainDropDownMenu 8 - dropDown.MouseLeave\connect -> - dropDown.Visible = false - ) + dropDownButton.MouseButton1Click\connect -> + setGui.TerrainDropDown.Visible = true + setGui.TerrainDropDown.Position = UDim2.new 0, parent.AbsolutePosition.X, 0, parent.AbsolutePosition.Y + currTerrainDropDownFrame = parent + buildInsertButton = -> + insertButton = makeInsertAssetButton! + insertButton.Name = "InsertAssetButton" + insertButton.Visible = true - createDropDownMenuButton = (parent) - dropDownButton = Instance.new "ImageButton" - dropDownButton.Name = "DropDownButton" - dropDownButton.Image = "http://www.roblox.com/asset/?id=67581509" - dropDownButton.BackgroundTransparency = 1 - dropDownButton.Size = UDim2.new 0, 16, 0, 16) - dropDownButton.Position = UDim2.new(1, -24, 0, 6) - dropDownButton.ZIndex = parent.ZIndex + 2 - dropDownButton.Parent = parent + if Data.Category[Data.CurrentCategory].SetName == "High Scalability" + createDropDownMenuButton insertButton - if not setGui:FindFirstChild "TerrainDropDown" - createTerrainDropDownMenu(8) + lastEnter = nil + mouseEnterCon = insertButton.MouseEnter\connect -> + lastEnter = insertButton + delay 0.1, -> + if lastEnter == insertButton + showLargePreview insertButton + insertButton, mouseEnterCon - dropDownButton.MouseButton1Click\connect -> - setGui.TerrainDropDown.Visible = true - setGui.TerrainDropDown.Position = UDim2.new 0, parent.AbsolutePosition.X, 0, parent.AbsolutePosition.Y) - currTerrainDropDownFrame = parent - ) + realignButtonGrid = (columns) -> + x = 0 + y = 0 + for i = 1, #insertButtons + insertButtons[i].Position = UDim2.new 0, buttonWidth * x, 0, buttonHeight * y + x += 1 + if x >= columns + x = 0 + y += 1 + setInsertButtonImageBehavior = (insertFrame, visible, name, assetId) -> + if visible + insertFrame.AssetName.Value = name + insertFrame.AssetId.Value = assetId + newImageUrl = SmallThumbnailUrl .. assetId + if newImageUrl ~= insertFrame.Button.ButtonImage.Image + delay 0, -> + game\GetService("ContentProvider")\Preload(SmallThumbnailUrl .. assetId) + insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId + + table.insert( + insertButtonCons, + insertFrame.Button.MouseButton1Click\connect -> + -- special case for water, show water selection gui + isWaterSelected = name == "Water" and + (Data.Category[Data.CurrentCategory].SetName == "High Scalability") + waterGui.Visible = isWaterSelected + objectSelected name, if isWaterSelected + tonumber(assetId), nil + else + tonumber assetId - buildInsertButton = () - insertButton = makeInsertAssetButton() - insertButton.Name = "InsertAssetButton" - insertButton.Visible = true - - if Data.Category[Data.CurrentCategory].SetName == "High Scalability" - createDropDownMenuButton(insertButton) - - - lastEnter = nil - mouseEnterCon = insertButton.MouseEnter\connect -> - lastEnter = insertButton - delay(0.1, function() - if lastEnter == insertButton - showLargePreview(insertButton) - - ) - ) - return insertButton, mouseEnterCon - - - realignButtonGrid = (columns) - x = 0 - y = 0 - for i = 1, #insertButtons - insertButtons[i].Position = UDim2.new 0, buttonWidth * x, 0, buttonHeight * y) - x += 1 - if x >= columns - x = 0 - y += 1 - - - - - setInsertButtonImageBehavior = (insertFrame, visible, name, assetId) - if visible - insertFrame.AssetName.Value = name - insertFrame.AssetId.Value = assetId - newImageUrl = SmallThumbnailUrl .. assetId - if newImageUrl ~= insertFrame.Button.ButtonImage.Image - delay(0, function() - game:GetService("ContentProvider"):Preload(SmallThumbnailUrl .. assetId) - insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId - ) - - table.insert( - insertButtonCons, - insertFrame.Button.MouseButton1Click\connect -> - -- special case for water, show water selection gui - isWaterSelected = (name == "Water") - and (Data.Category[Data.CurrentCategory].SetName == "High Scalability") - waterGui.Visible = isWaterSelected - if isWaterSelected - objectSelected(name, tonumber(assetId), nil) - else - objectSelected(name, tonumber(assetId)) - - ) ) - insertFrame.Visible = true - else - insertFrame.Visible = false - - - loadSectionOfItems = (setGui, rows, columns) - pageSize = rows * columns - - if arrayPosition > #contents - return - - - origArrayPos = arrayPosition - - for _ = 1, pageSize + 1 - if arrayPosition >= #contents + 1 - break - - - local buttonCon - insertButtons[arrayPosition], buttonCon = buildInsertButton() - table.insert(insertButtonCons, buttonCon) - insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame - arrayPosition += 1 - - realignButtonGrid(columns) - - -- indexCopy = origArrayPos - for index = origArrayPos, arrayPosition - if insertButtons[index] - if contents[index] - -- we don't want water to have a drop down button - if contents[index].Name == "Water" - if Data.Category[Data.CurrentCategory].SetName == "High Scalability" - insertButtons[index]:FindFirstChild("DropDownButton", true):Destroy() - - - - local assetId - if useAssetVersionId - assetId = contents[index].AssetVersionId - else - assetId = contents[index].AssetId - - setInsertButtonImageBehavior(insertButtons[index], true, contents[index].Name, assetId) - else - break - - else - break - - -- indexCopy = index - - - - setSetIndex = () - Data.Category[Data.CurrentCategory].Index = 0 - - rows = 7 - columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) - - contents = Data.Category[Data.CurrentCategory].Contents - if contents - -- remove our buttons and their connections - for i = 1, #insertButtons - insertButtons[i]:remove() - - for i = 1, #insertButtonCons - if insertButtonCons[i] - insertButtonCons[i]\disconnect! - - - insertButtonCons = {} - insertButtons = {} - - arrayPosition = 1 - loadSectionOfItems(setGui, rows, columns) - - - - selectSet = (button, setName, setId, _) - if button and Data.Category[Data.CurrentCategory] ~= nil - if button ~= Data.Category[Data.CurrentCategory].Button - Data.Category[Data.CurrentCategory].Button = button - - if SetCache[setId] == nil - SetCache[setId] = game:GetService("InsertService"):GetCollection(setId) - - Data.Category[Data.CurrentCategory].Contents = SetCache[setId] - - Data.Category[Data.CurrentCategory].SetName = setName - Data.Category[Data.CurrentCategory].SetId = setId - - setSetIndex() - - - - selectCategoryPage = (buttons, _) - if buttons ~= Data.CurrentCategory - if Data.CurrentCategory - for _, button in pairs(Data.CurrentCategory) - button.Visible = false - - - - Data.CurrentCategory = buttons - if Data.Category[Data.CurrentCategory] == nil - Data.Category[Data.CurrentCategory] = {} - if #buttons > 0 - selectSet(buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0) - - else - Data.Category[Data.CurrentCategory].Button = nil - selectSet( - Data.Category[Data.CurrentCategory].ButtonFrame, - Data.Category[Data.CurrentCategory].SetName, - Data.Category[Data.CurrentCategory].SetId, - Data.Category[Data.CurrentCategory].Index - ) - - - - - selectCategory = (category) - selectCategoryPage(category, 0) - - - resetAllSetButtonSelection = () - setButtons = setGui.SetPanel.Sets.SetsLists\GetChildren! - for i = 1, #setButtons - if setButtons[i]\IsA "TextButton" - setButtons[i].Selected = false - setButtons[i].BackgroundTransparency = 1 - setButtons[i].TextColor3 = Color3.new 1, 1, 1 - setButtons[i].BackgroundColor3 = Color3.new 1, 1, 1 - - - - - populateSetsFrame = () - currRow = 0 - for i = 1, #userCategoryButtons - button = userCategoryButtons[i] - button.Visible = true - button.Position = UDim2.new 0, 5, 0, currRow * button.Size.Y.Offset) - button.Parent = setGui.SetPanel.Sets.SetsLists - - if i == 1 then -- we will have this selected by default, so show it - button.Selected = true - button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) - button.TextColor3 = Color3.new 0, 0, 0 - button.BackgroundTransparency = 0 - - - button.MouseEnter\connect -> - if not button.Selected - button.BackgroundTransparency = 0 - button.TextColor3 = Color3.new 0, 0, 0 - - ) - button.MouseLeave\connect -> - if not button.Selected - button.BackgroundTransparency = 1 - button.TextColor3 = Color3.new 1, 1, 1 - - ) - button.MouseButton1Click\connect -> - resetAllSetButtonSelection() - button.Selected = not button.Selected - button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) - button.TextColor3 = Color3.new 0, 0, 0 - button.BackgroundTransparency = 0 - selectSet(button, button.Text, userCategoryButtons[i].SetId.Value, 0) - ) - - currRow += 1 - - - buttons = setGui.SetPanel.Sets.SetsLists\GetChildren! - - -- set first category as loaded for default - if buttons - for i = 1, #buttons - if buttons[i]\IsA "TextButton" - selectSet(buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0) - selectCategory(userCategoryButtons) - break - - - - - - setGui = createSetGui() - waterGui, waterTypeChangedEvent = createWaterGui() - waterGui.Position = UDim2.new 0, 55, 0, 0) - waterGui.Parent = setGui - setGui.Changed\connect((p ->rop) -- this resizes the preview image to always be the right size - if prop == "AbsoluteSize" - handleResize() - setSetIndex() - -) - - local scrollFrame, controlFrame = t.CreateTrueScrollingFrame() - scrollFrame.Size = UDim2.new 0.54, 0, 0.85, 0) - scrollFrame.Position = UDim2.new 0.24, 0, 0.085, 0) - scrollFrame.Name = "ItemsFrame" - scrollFrame.ZIndex = 6 - scrollFrame.Parent = setGui.SetPanel - scrollFrame.BackgroundTransparency = 1 - - drillDownSetZIndex(controlFrame, 7) - - controlFrame.Parent = setGui.SetPanel - controlFrame.Position = UDim2.new 0.76, 5, 0, 0) - - debounce = false - controlFrame.ScrollBottom.Changed\connect(function(_) - if controlFrame.ScrollBottom.Value == true - if debounce - return - - debounce = true - loadSectionOfItems(setGui, rows, columns) - debounce = false - -) - - userData = {} - for id = 1, #userIdsForSets - newUserData = game:GetService("InsertService"):GetUserSets(userIdsForSets[id]) - if newUserData and #newUserData > 2 - -- start at #3 to skip over My Decals and My Models for each account - for category = 3, #newUserData - if newUserData[category].Name == "High Scalability" then -- we want high scalability parts to show first - table.insert(userData, 1, newUserData[category]) - else - table.insert(userData, newUserData[category]) - - - - - if userData - userCategoryButtons = processCategory(userData) - - - rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight) - columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) - - populateSetsFrame() - - --[[insertPanelCloseCon = ] ] - setGui.SetPanel.CancelButton.MouseButton1Click\connect -> - setGui.SetPanel.Visible = false - if dialogClosed - dialogClosed() - -) - - setVisibilityFunction = function(visible) - if visible - setGui.SetPanel.Visible = true - else - setGui.SetPanel.Visible = false - - - - getVisibilityFunction = function() - if setGui - if setGui:FindFirstChild "SetPanel" - return setGui.SetPanel.Visible - - - - return false - - - return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent - - t.CreateTerrainMaterialSelector = function(size, position) - terrainMaterialSelectionChanged = Instance.new "BindableEvent" - terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" - - selectedButton = nil - - frame = Instance.new "Frame" - frame.Name = "TerrainMaterialSelector" - if size - frame.Size = size - else - frame.Size = UDim2.new 0, 245, 0, 230) - if position - frame.Position = position - frame.BorderSizePixel = 0 - frame.BackgroundColor3 = Color3.new 0, 0, 0 - frame.Active = true - - terrainMaterialSelectionChanged.Parent = frame - - waterEnabled = true -- todo: turn this on when water is ready - - materialToImageMap = {} - materialNames = { - "Grass", - "Sand", - "Brick", - "Granite", - "Asphalt", - "Iron", - "Aluminum", - "Gold", - "Plank", - "Log", - "Gravel", - "Cinder Block", - "Stone Wall", - "Concrete", - "Plastic (red)", - "Plastic (blue)", - } - if waterEnabled - table.insert(materialNames, "Water") - currentMaterial = 1 - - function getEnumFromName(choice) - if choice == "Grass" - return 1 - - if choice == "Sand" - return 2 - - if choice == "Erase" - return 0 - - if choice == "Brick" - return 3 - - if choice == "Granite" - return 4 - - if choice == "Asphalt" - return 5 - - if choice == "Iron" - return 6 - - if choice == "Aluminum" - return 7 - - if choice == "Gold" - return 8 - - if choice == "Plank" - return 9 - - if choice == "Log" - return 10 - - if choice == "Gravel" - return 11 - - if choice == "Cinder Block" - return 12 - - if choice == "Stone Wall" - return 13 - - if choice == "Concrete" - return 14 - - if choice == "Plastic (red)" - return 15 - - if choice == "Plastic (blue)" - return 16 - - if choice == "Water" - return 17 - - - function getNameFromEnum(choice) - if choice == Enum.CellMaterial.Grass or choice == 1 - return "Grass" - elseif choice == Enum.CellMaterial.Sand or choice == 2 - return "Sand" - elseif choice == Enum.CellMaterial.Empty or choice == 0 - return "Erase" - elseif choice == Enum.CellMaterial.Brick or choice == 3 - return "Brick" - elseif choice == Enum.CellMaterial.Granite or choice == 4 - return "Granite" - elseif choice == Enum.CellMaterial.Asphalt or choice == 5 - return "Asphalt" - elseif choice == Enum.CellMaterial.Iron or choice == 6 - return "Iron" - elseif choice == Enum.CellMaterial.Aluminum or choice == 7 - return "Aluminum" - elseif choice == Enum.CellMaterial.Gold or choice == 8 - return "Gold" - elseif choice == Enum.CellMaterial.WoodPlank or choice == 9 - return "Plank" - elseif choice == Enum.CellMaterial.WoodLog or choice == 10 - return "Log" - elseif choice == Enum.CellMaterial.Gravel or choice == 11 - return "Gravel" - elseif choice == Enum.CellMaterial.CinderBlock or choice == 12 - return "Cinder Block" - elseif choice == Enum.CellMaterial.MossyStone or choice == 13 - return "Stone Wall" - elseif choice == Enum.CellMaterial.Cement or choice == 14 - return "Concrete" - elseif choice == Enum.CellMaterial.RedPlastic or choice == 15 - return "Plastic (red)" - elseif choice == Enum.CellMaterial.BluePlastic or choice == 16 - return "Plastic (blue)" - - - if waterEnabled - if choice == Enum.CellMaterial.Water or choice == 17 - return "Water" - - - - updateMaterialChoice = (choice) - currentMaterial = getEnumFromName(choice) - terrainMaterialSelectionChanged:Fire(currentMaterial) - - -- we so need a better way to do this - for _, v in pairs(materialNames) - materialToImageMap[v] = {} - if v == "Grass" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=56563112" - elseif v == "Sand" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=62356652" - elseif v == "Brick" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=65961537" - elseif v == "Granite" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532153" - elseif v == "Asphalt" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532038" - elseif v == "Iron" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532093" - elseif v == "Aluminum" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531995" - elseif v == "Gold" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532118" - elseif v == "Plastic (red)" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531848" - elseif v == "Plastic (blue)" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531924" - elseif v == "Plank" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532015" - elseif v == "Log" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532051" - elseif v == "Gravel" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532206" - elseif v == "Cinder Block" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532103" - elseif v == "Stone Wall" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531804" - elseif v == "Concrete" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532059" - elseif v == "Water" - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=81407474" + insertFrame.Visible = true else - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=66887593" -- fill in the rest here!! + insertFrame.Visible = false + + loadSectionOfItems = (setGui, rows, columns) -> + pageSize = rows * columns + + return if arrayPosition > #contents + + origArrayPos = arrayPosition + + for _ = 1, pageSize + 1 + break if arrayPosition >= #contents + 1 + + local buttonCon + insertButtons[arrayPosition], buttonCon = buildInsertButton! + table.insert insertButtonCons, buttonCon + insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame + arrayPosition += 1 + + realignButtonGrid columns + + -- indexCopy = origArrayPos + for index = origArrayPos, arrayPosition + if insertButtons[index] + if contents[index] + -- we don't want water to have a drop down button + if contents[index].Name == "Water" and + Data.Category[Data.CurrentCategory].SetName == "High Scalability" + insertButtons[index]\FindFirstChild("DropDownButton", true)\Destroy! + + local assetId + assetId = if useAssetVersionId + contents[index].AssetVersionId + else + contents[index].AssetId + + setInsertButtonImageBehavior insertButtons[index], true, contents[index].Name, assetId + else break + else break + + -- indexCopy = index + + setSetIndex = -> + Data.Category[Data.CurrentCategory].Index = 0 + + rows = 7 + columns = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth + + contents = Data.Category[Data.CurrentCategory].Contents + if contents + -- remove our buttons and their connections + for i = 1, #insertButtons + insertButtons[i]\remove! + + for i = 1, #insertButtonCons + if insertButtonCons[i] + insertButtonCons[i]\disconnect! - local scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame(nil, "grid") - scrollFrame.Size = UDim2.new 0.85, 0, 1, 0) - scrollFrame.Position = UDim2.new 0, 0, 0, 0) - scrollFrame.Parent = frame + insertButtonCons = {} + insertButtons = {} - scrollUp.Parent = frame - scrollUp.Visible = true - scrollUp.Position = UDim2.new(1, -19, 0, 0) + arrayPosition = 1 + loadSectionOfItems setGui, rows, columns - scrollDown.Parent = frame - scrollDown.Visible = true - scrollDown.Position = UDim2.new(1, -19, 1, -17) + selectSet = (button, setName, setId, _) -> + if button and Data.Category[Data.CurrentCategory]? + with Data.Category[Data.CurrentCategory] + if button ~= .Button + .Button = button - goToNewMaterial = (buttonWrap, materialName) - updateMaterialChoice(materialName) - buttonWrap.BackgroundTransparency = 0 - selectedButton.BackgroundTransparency = 1 - selectedButton = buttonWrap + if not SetCache[setId]? + SetCache[setId] = game\GetService("InsertService")\GetCollection setId - createMaterialButton = (name) - buttonWrap = Instance.new "TextButton" - buttonWrap.Text = "" - buttonWrap.Size = UDim2.new 0, 32, 0, 32) - buttonWrap.BackgroundColor3 = Color3.new 1, 1, 1 - buttonWrap.BorderSizePixel = 0 - buttonWrap.BackgroundTransparency = 1 - buttonWrap.AutoButtonColor = false - buttonWrap.Name = tostring(name) + .Contents = SetCache[setId] + .SetName = setName + .SetId = setId - imageButton = Instance.new "ImageButton" - imageButton.AutoButtonColor = false - imageButton.BackgroundTransparency = 1 - imageButton.Size = UDim2.new 0, 30, 0, 30) - imageButton.Position = UDim2.new 0, 1, 0, 1) - imageButton.Name = tostring(name) - imageButton.Parent = buttonWrap - imageButton.Image = materialToImageMap[name].Regular + setSetIndex! - enumType = Instance.new "NumberValue" - enumType.Name = "EnumType" - enumType.Parent = buttonWrap - enumType.Value = 0 + selectCategoryPage = (buttons, _) -> + if buttons ~= Data.CurrentCategory + if Data.CurrentCategory + for _, button in pairs Data.CurrentCategory + button.Visible = false - imageButton.MouseEnter\connect -> + Data.CurrentCategory = buttons + if not Data.Category[Data.CurrentCategory]? + Data.Category[Data.CurrentCategory] = {} + if #buttons > 0 + selectSet(buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0) + + else with Data.Category[Data.CurrentCategory] + .Button = nil + selectSet( + .ButtonFrame, + .SetName, + .SetId, + .Index + ) + + selectCategory = (category) -> + selectCategoryPage category, 0 + + resetAllSetButtonSelection = -> + setButtons = setGui.SetPanel.Sets.SetsLists\GetChildren! + for i = 1, #setButtons + with setButtons[i] do if \IsA "TextButton" + .Selected = false + .BackgroundTransparency = 1 + .TextColor3 = Color3.new 1, 1, 1 + .BackgroundColor3 = Color3.new 1, 1, 1 + + populateSetsFrame = -> + currRow = 0 + + for i = 1, #userCategoryButtons do with button = userCategoryButtons[i] + .Visible = true + .Position = UDim2.new 0, 5, 0, currRow * .Size.Y.Offset + .Parent = setGui.SetPanel.Sets.SetsLists + + if i == 1 -- we will have this selected by default, so show it + .Selected = true + .BackgroundColor3 = Color3.new 0, 204 / 255, 0 + .TextColor3 = Color3.new 0, 0, 0 + .BackgroundTransparency = 0 + + .MouseEnter\connect -> + if not .Selected + .BackgroundTransparency = 0 + .TextColor3 = Color3.new 0, 0, 0 + + .MouseLeave\connect -> + if not .Selected + .BackgroundTransparency = 1 + .TextColor3 = Color3.new 1, 1, 1 + + .MouseButton1Click\connect -> + resetAllSetButtonSelection! + .Selected = not .Selected + .BackgroundColor3 = Color3.new 0, 204 / 255, 0 + .TextColor3 = Color3.new 0, 0, 0 + .BackgroundTransparency = 0 + selectSet button, .Text, userCategoryButtons[i].SetId.Value, 0 + + currRow += 1 + + buttons = setGui.SetPanel.Sets.SetsLists\GetChildren! + + -- set first category as loaded for default + if buttons + for i = 1, #buttons + if buttons[i]\IsA "TextButton" + selectSet buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0 + selectCategory userCategoryButtons + break + + setGui = createSetGui! + waterGui, waterTypeChangedEvent = createWaterGui! + waterGui.Position = UDim2.new 0, 55, 0, 0 + waterGui.Parent = setGui + setGui.Changed\connect (prop) -> -- this resizes the preview image to always be the right size + if prop == "AbsoluteSize" + handleResize! + setSetIndex! + + scrollFrame, controlFrame = t.CreateTrueScrollingFrame! + with scrollFrame + .Name = "ItemsFrame" + .Size = UDim2.new 0.54, 0, 0.85, 0 + .Position = UDim2.new 0.24, 0, 0.085, 0 + .ZIndex = 6 + .Parent = setGui.SetPanel + .BackgroundTransparency = 1 + + drillDownSetZIndex controlFrame, 7 + + controlFrame.Parent = setGui.SetPanel + controlFrame.Position = UDim2.new 0.76, 5, 0, 0 + + debounce = false + + rows = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight + columns = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth + + controlFrame.ScrollBottom.Changed\connect (_) -> + if controlFrame.ScrollBottom.Value == true + return if debounce + + debounce = true + loadSectionOfItems setGui, rows, columns + debounce = false + + userData = {} + for id = 1, #userIdsForSets + newUserData = game\GetService("InsertService")\GetUserSets userIdsForSets[id] + if newUserData and #newUserData > 2 + -- start at #3 to skip over My Decals and My Models for each account + for category = 3, #newUserData + table.insert userData, if newUserData[category].Name == "High Scalability" -- we want high scalability parts to show first + 1, newUserData[category] + else + newUserData[category] + + if userData + userCategoryButtons = processCategory userData + + populateSetsFrame! + + --[[insertPanelCloseCon = ]] + setGui.SetPanel.CancelButton.MouseButton1Click\connect -> + setGui.SetPanel.Visible = false + dialogClosed?! + + setVisibilityFunction = (visible) -> + setGui.SetPanel.Visible = not not visible + + getVisibilityFunction = -> + if setGui?\FindFirstChild "SetPanel" + return setGui.SetPanel.Visible + false + + setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent + +t.CreateTerrainMaterialSelector = (size, position) -> + terrainMaterialSelectionChanged = Instance.new "BindableEvent" + terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" + + local selectedButton + + frame = New "Frame", "TerrainMaterialSelector" + Size: size or UDim2.new 0, 245, 0, 230 + BorderSizePixel: 0 + BackgroundColor3: Color3.new 0, 0, 0 + Active: true + + if position + frame.Position = position + + terrainMaterialSelectionChanged.Parent = frame + + -- waterEnabled = true -- todo: turn this on when water is ready + + materialToImageMap = {} + materialNames = + * "Grass" + * "Sand" + * "Brick" + * "Granite" + * "Asphalt" + * "Iron" + * "Aluminum" + * "Gold" + * "Plank" + * "Log" + * "Gravel" + * "Cinder Block" + * "Stone Wall" + * "Concrete" + * "Plastic (red)" + * "Plastic (blue)" + * "Water" + -- if waterEnabled + -- table.insert materialNames, "Water" + + currentMaterial = 1 + + getEnumFromName = (choice) -> + for i, v in ipairs materialNames + return i if v == choice + + getNameFromEnum = (choice) -> + switch choice + when Enum.CellMaterial.Grass, 1 then "Grass" + when Enum.CellMaterial.Sand, 2 then "Sand" + when Enum.CellMaterial.Empty, 0 then "Erase" + when Enum.CellMaterial.Brick, 3 then "Brick" + when Enum.CellMaterial.Granite, 4 then "Granite" + when Enum.CellMaterial.Asphalt, 5 then "Asphalt" + when Enum.CellMaterial.Iron, 6 then "Iron" + when Enum.CellMaterial.Aluminum, 7 then "Aluminum" + when Enum.CellMaterial.Gold, 8 then "Gold" + when Enum.CellMaterial.WoodPlank, 9 then "Plank" + when Enum.CellMaterial.WoodLog, 10 then "Log" + when Enum.CellMaterial.Gravel, 11 then "Gravel" + when Enum.CellMaterial.CinderBlock, 12 then "Cinder Block" + when Enum.CellMaterial.MossyStone, 13 then "Stone Wall" + when Enum.CellMaterial.Cement, 14 then "Concrete" + when Enum.CellMaterial.RedPlastic, 15 then "Plastic (red)" + when Enum.CellMaterial.BluePlastic, 16 then "Plastic (blue)" + when Enum.CellMaterial.Water, 17 then "Water" + + updateMaterialChoice = (choice) -> + currentMaterial = getEnumFromName choice + terrainMaterialSelectionChanged\Fire currentMaterial + + -- we so need a better way to do this + for _, v in pairs materialNames + materialToImageMap[v] = {} + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=#{switch v + when "Grass" then 56563112 + when "Sand" then 62356652 + when "Brick" then 65961537 + when "Granite" then 67532153 + when "Asphalt" then 67532038 + when "Iron" then 67532093 + when "Aluminum" then 67531995 + when "Gold" then 67532118 + when "Plastic (red)" then 67531848 + when "Plastic (blue)" then 67531924 + when "Plank" then 67532015 + when "Log" then 67532051 + when "Gravel" then 67532206 + when "Cinder Block" then 67532103 + when "Stone Wall" then 67531804 + when "Concrete" then 67532059 + when "Water" then 81407474 + else 66887593}" + + -- fill in the rest here!! + + scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame nil, "grid" + + with scrollFrame + .Size = UDim2.new 0.85, 0, 1, 0 + .Position = UDim2.new 0, 0, 0, 0 + .Parent = frame + + with scrollUp + .Parent = frame + .Visible = true + .Position = UDim2.new 1, -19, 0, 0 + + with scrollDown + .Parent = frame + .Visible = true + .Position = UDim2.new 1, -19, 1, -17 + + goToNewMaterial = (buttonWrap, materialName) -> + updateMaterialChoice materialName + buttonWrap.BackgroundTransparency = 0 + selectedButton.BackgroundTransparency = 1 + selectedButton = buttonWrap + + createMaterialButton = (name) -> + buttonWrap = New "TextButton", "#{name}" + Text: "" + Size: UDim2.new 0, 32, 0, 32 + BackgroundColor3: Color3.new 1, 1, 1 + BorderSizePixel: 0 + BackgroundTransparency: 1 + AutoButtonColor: false + + * New "ImageButton", "#{name}" + AutoButtonColor: false + BackgroundTransparency: 1 + Size: UDim2.new 0, 30, 0, 30 + Position: UDim2.new 0, 1, 0, 1 + Image: materialToImageMap[name].Regular + + * New "NumberValue", "EnumType" + Value: 0 + + with buttonWrap.ImageButton + .MouseEnter\connect -> buttonWrap.BackgroundTransparency = 0 -) - imageButton.MouseLeave\connect -> + .MouseLeave\connect -> if selectedButton ~= buttonWrap buttonWrap.BackgroundTransparency = 1 - -) - imageButton.MouseButton1Click\connect -> + .MouseButton1Click\connect -> if selectedButton ~= buttonWrap - goToNewMaterial(buttonWrap, tostring(name)) + goToNewMaterial buttonWrap, tostring name -) + buttonWrap - return buttonWrap + for i = 1, #materialNames + imageButton = createMaterialButton materialNames[i] - for i = 1, #materialNames - imageButton = createMaterialButton(materialNames[i]) + if materialNames[i] == "Grass" then -- always start with grass as the default + selectedButton = imageButton + imageButton.BackgroundTransparency = 0 - if materialNames[i] == "Grass" then -- always start with grass as the default - selectedButton = imageButton - imageButton.BackgroundTransparency = 0 + imageButton.Parent = scrollFrame + forceTerrainMaterialSelection = (newMaterialType) -> + return if not newMaterialType + return if currentMaterial == newMaterialType - imageButton.Parent = scrollFrame - - forceTerrainMaterialSelection = function(newMaterialType) - if not newMaterialType + matName = getNameFromEnum newMaterialType + buttons = scrollFrame\GetChildren! + for i = 1, #buttons + if (buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)") or + (buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)") or + (string.find buttons[i].Name, matName) + goToNewMaterial buttons[i], matName return - if currentMaterial == newMaterialType - return + frame.Changed\connect (prop) -> + if prop == "AbsoluteSize" + recalculateScroll! + recalculateScroll! + frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection - matName = getNameFromEnum(newMaterialType) - buttons = scrollFrame\GetChildren! - for i = 1, #buttons - if buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)" - goToNewMaterial(buttons[i], matName) - return +t.CreateLoadingFrame = (name, size, position) -> + game\GetService("ContentProvider")\Preload "http://www.roblox.com/asset/?id=35238053" - if buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)" - goToNewMaterial(buttons[i], matName) - return + loadingFrame = New "Frame", "LoadingFrame" + Style: Enum.FrameStyle.RobloxRound + Size: size or UDim2.new 0, 300, 0, 160 + Position: position or UDim2.new 0.5, -150, 0.5, -80 - if string.find(buttons[i].Name, matName) - goToNewMaterial(buttons[i], matName) - return + * New "TextLabel", "loadingName" + BackgroundTransparency: 1 + Size: UDim2.new 1, 0, 0, 18 + Position: UDim2.new 0, 0, 0, 2 + Font: Enum.Font.Arial + Text: name + TextColor3: Color3.new 1, 1, 1 + TextStrokeTransparency: 1 + FontSize: Enum.FontSize.Size18 + * New "TextButton", "CancelButton" + Position: UDim2.new 0.5, -60, 1, -40 + Size: UDim2.new 0, 120, 0, 40 + Font: Enum.Font.Arial + FontSize: Enum.FontSize.Size18 + TextColor3: Color3.new 1, 1, 1 + Text: "Cancel" + Style: Enum.ButtonStyle.RobloxButton + * New "Frame", "LoadingBar" + BackgroundColor3: Color3.new 0, 0, 0 + BorderColor3: Color3.new 79 / 255, 79 / 255, 79 / 255 + Position: UDim2.new 0, 0, 0, 41 + Size: UDim2.new 1, 0, 0, 30 - frame.Changed\connect((p ->rop) - if prop == "AbsoluteSize" - recalculateScroll() + * New "ImageLabel", "LoadingGreenBar" + Image: "http://www.roblox.com/asset/?id=35238053" + Position: UDim2.new 0, 0, 0, 0 + Size: UDim2.new 0, 0, 1, 0 + Visible: false + * New "TextLabel", "LoadingPercent" + BackgroundTransparency: 1 + Position: UDim2.new 0, 0, 1, 0 + Size: UDim2.new 1, 0, 0, 14 + Font: Enum.Font.Arial + Text: "0%" + FontSize: Enum.FontSize.Size14 + TextColor3: Color3.new 1, 1, 1 + { -- Destructure + CancelButton: cancelButton + LoadingBar: + LoadingGreenBar: loadingGreenBar + LoadingPercent: loadingPercent + } = loadingFrame - recalculateScroll() - return frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection - end + cancelButtonClicked = New "BindableEvent", "CancelButtonClicked" + Parent: cancelButton - t.CreateLoadingFrame = function(name, size, position) - game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=35238053" + cancelButton.MouseButton1Click\connect -> + cancelButtonClicked\Fire! - loadingFrame = Instance.new "Frame" - loadingFrame.Name = "LoadingFrame" - loadingFrame.Style = Enum.FrameStyle.RobloxRound + updateLoadingGuiPercent = (percent, tweenAction, tweenLength) -> + if percent and type(percent) ~= "number" + error "updateLoadingGuiPercent expects number as argument, got", type(percent), "instead" - if size - loadingFrame.Size = size + newSize = UDim2.new if percent < 0 + 0, 0, 1, 0 + elseif percent > 1 + 1, 0, 1, 0 else - loadingFrame.Size = UDim2.new 0, 300, 0, 160) - if position - loadingFrame.Position = position - else - loadingFrame.Position = UDim2.new 0.5, -150, 0.5, -80) - - loadingBar = Instance.new "Frame" - loadingBar.Name = "LoadingBar" - loadingBar.BackgroundColor3 = Color3.new 0, 0, 0 - loadingBar.BorderColor3 = Color3.new(79 / 255, 79 / 255, 79 / 255) - loadingBar.Position = UDim2.new 0, 0, 0, 41) - loadingBar.Size = UDim2.new(1, 0, 0, 30) - loadingBar.Parent = loadingFrame - - loadingGreenBar = Instance.new "ImageLabel" - loadingGreenBar.Name = "LoadingGreenBar" - loadingGreenBar.Image = "http://www.roblox.com/asset/?id=35238053" - loadingGreenBar.Position = UDim2.new 0, 0, 0, 0) - loadingGreenBar.Size = UDim2.new 0, 0, 1, 0) - loadingGreenBar.Visible = false - loadingGreenBar.Parent = loadingBar - - loadingPercent = Instance.new "TextLabel" - loadingPercent.Name = "LoadingPercent" - loadingPercent.BackgroundTransparency = 1 - loadingPercent.Position = UDim2.new 0, 0, 1, 0) - loadingPercent.Size = UDim2.new(1, 0, 0, 14) - loadingPercent.Font = Enum.Font.Arial - loadingPercent.Text = "0%" - loadingPercent.FontSize = Enum.FontSize.Size14 - loadingPercent.TextColor3 = Color3.new 1, 1, 1 - loadingPercent.Parent = loadingBar - - cancelButton = Instance.new "TextButton" - cancelButton.Name = "CancelButton" - cancelButton.Position = UDim2.new 0.5, -60, 1, -40) - cancelButton.Size = UDim2.new 0, 120, 0, 40) - cancelButton.Font = Enum.Font.Arial - cancelButton.FontSize = Enum.FontSize.Size18 - cancelButton.TextColor3 = Color3.new 1, 1, 1 - cancelButton.Text = "Cancel" - cancelButton.Style = Enum.ButtonStyle.RobloxButton - cancelButton.Parent = loadingFrame - - loadingName = Instance.new "TextLabel" - loadingName.Name = "loadingName" - loadingName.BackgroundTransparency = 1 - loadingName.Size = UDim2.new(1, 0, 0, 18) - loadingName.Position = UDim2.new 0, 0, 0, 2) - loadingName.Font = Enum.Font.Arial - loadingName.Text = name - loadingName.TextColor3 = Color3.new 1, 1, 1 - loadingName.TextStrokeTransparency = 1 - loadingName.FontSize = Enum.FontSize.Size18 - loadingName.Parent = loadingFrame - - cancelButtonClicked = Instance.new "BindableEvent" - cancelButtonClicked.Name = "CancelButtonClicked" - cancelButtonClicked.Parent = cancelButton - cancelButton.MouseButton1Click\connect -> - cancelButtonClicked:Fire() - - - updateLoadingGuiPercent = function(percent, tweenAction, tweenLength) - if percent and type(percent) ~= "number" - error("updateLoadingGuiPercent expects number as argument, got", type(percent), "instead") - - - newSize = nil - if percent < 0 - newSize = UDim2.new 0, 0, 1, 0) - elseif percent > 1 - newSize = UDim2.new(1, 0, 1, 0) - else - newSize = UDim2.new(percent, 0, 1, 0) - - - if tweenAction - if not tweenLength - error "updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument" + percent, 0, 1, 0 + if tweenAction + if not tweenLength + error "updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument" + loadingGreenBar\TweenSize newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, if newSize.X.Scale > 0 loadingGreenBar.Visible = true - loadingGreenBar:TweenSize(newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, true) + true else - loadingGreenBar:TweenSize( - newSize, - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - tweenLength, - true, - function() - if newSize.X.Scale < 0 - loadingGreenBar.Visible = false - - - ) - - else - loadingGreenBar.Size = newSize - loadingGreenBar.Visible = (newSize.X.Scale > 0) - - - loadingGreenBar.Changed\connect((p ->rop) - if prop == "Size" - loadingPercent.Text = tostring(math.ceil(loadingGreenBar.Size.X.Scale * 100)) .. "%" - - - - return loadingFrame, updateLoadingGuiPercent, cancelButtonClicked - end - - t.CreatePluginFrame = function(name, size, position, scrollable, parent) - function createMenuButton(size, position, text, fontsize, name, parent) - button = Instance.new "TextButton" - button.AutoButtonColor = false - button.Name = name - button.BackgroundTransparency = 1 - button.Position = position - button.Size = size - button.Font = Enum.Font.ArialBold - button.FontSize = fontsize - button.Text = text - button.TextColor3 = Color3.new 1, 1, 1 - button.BorderSizePixel = 0 - button.BackgroundColor3 = Color3.new(20 / 255, 20 / 255, 20 / 255) - - button.MouseEnter\connect -> - if button.Selected - return - - button.BackgroundTransparency = 0 -) - button.MouseLeave\connect -> - if button.Selected - return - - button.BackgroundTransparency = 1 -) - - button.Parent = parent - - return button - - dragBar = Instance.new "Frame" - dragBar.Name = tostring(name) .. "DragBar" - dragBar.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255) - dragBar.BorderColor3 = Color3.new 0, 0, 0 - if size - dragBar.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + UDim2.new 0, 20, 0, 0) + true, -> + if newSize.X.Scale < 0 + loadingGreenBar.Visible = false + else - dragBar.Size = UDim2.new 0, 183, 0, 20) - if position - dragBar.Position = position - dragBar.Active = true - dragBar.Draggable = true - --dragBar.Visible = false - dragBar.MouseEnter\connect -> - dragBar.BackgroundColor3 = Color3.new(49 / 255, 49 / 255, 49 / 255) + loadingGreenBar.Size = newSize + loadingGreenBar.Visible = newSize.X.Scale > 0 - dragBar.MouseLeave\connect -> - dragBar.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255) - dragBar.Parent = parent + loadingGreenBar.Changed\connect (prop) -> + if prop == "Size" + loadingPercent.Text = "#{math.ceil loadingGreenBar.Size.X.Scale * 100}%" + + loadingFrame, updateLoadingGuiPercent, cancelButtonClicked + +t.CreatePluginFrame = (name, size, position, scrollable, parent) -> + createMenuButton = (size, position, text, fontsize, name, parent) -> + with New "TextButton", name, + AutoButtonColor: false + BackgroundTransparency: 1 + Position: position + Size: size + Font: Enum.Font.ArialBold + FontSize: fontsize + Text: text + TextColor3: Color3.new 1, 1, 1 + BorderSizePixel: 0 + BackgroundColor3: Color3.new 20 / 255, 20 / 255, 20 / 255 + + .MouseEnter\connect -> + return if .Selected + .BackgroundTransparency = 0 + + .MouseLeave\connect -> + return if .Selected + .BackgroundTransparency = 1 + + .Parent = parent + + dragBar = New "Frame", "#{name}DragBar" + BackgroundColor3: Color3.new 39 / 255, 39 / 255, 39 / 255 + BorderColor3: Color3.new 0, 0, 0 + Size: if size + UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + UDim2.new 0, 20, 0, 0 + else + UDim2.new 0, 183, 0, 20 + Active: true + Draggable: true -- plugin name label - pluginNameLabel = Instance.new "TextLabel" - pluginNameLabel.Name = "BarNameLabel" - pluginNameLabel.Text = " " .. tostring(name) - pluginNameLabel.TextColor3 = Color3.new 1, 1, 1 - pluginNameLabel.TextStrokeTransparency = 0 - pluginNameLabel.Size = UDim2.new(1, 0, 1, 0) - pluginNameLabel.Font = Enum.Font.ArialBold - pluginNameLabel.FontSize = Enum.FontSize.Size18 - pluginNameLabel.TextXAlignment = Enum.TextXAlignment.Left - pluginNameLabel.BackgroundTransparency = 1 - pluginNameLabel.Parent = dragBar + * New "TextLabel", "BarNameLabel" + Text: " #{name}" + TextColor3: Color3.new 1, 1, 1 + TextStrokeTransparency: 0 + Size: UDim2.new 1, 0, 1, 0 + Font: Enum.Font.ArialBold + FontSize: Enum.FontSize.Size18 + TextXAlignment: Enum.TextXAlignment.Left + BackgroundTransparency: 1 - -- close button - closeButton = createMenuButton( - UDim2.new 0, 15, 0, 17), - UDim2.new(1, -16, 0.5, -8), - "X", - Enum.FontSize.Size14, - "CloseButton", - dragBar - ) - closeEvent = Instance.new "BindableEvent" - closeEvent.Name = "CloseEvent" - closeEvent.Parent = closeButton - closeButton.MouseButton1Click\connect -> - closeEvent:Fire() - closeButton.BackgroundTransparency = 1 + * New "Frame", "HelpFrame" + BackgroundColor3: Color3.new 0, 0, 0 + Size: UDim2.new 0, 300, 0, 552 + Position: UDim2.new 1, 5, 0, 0 + Active: true + BorderSizePixel: 0 + Visible: false + * New "Frame", "SeparatingLine" + BackgroundColor3: Color3.new 115 / 255, 115 / 255, 115 / 255 + BorderSizePixel: 0 + Position: UDim2.new 1, -18, 0.5, -7 + Size: UDim2.new 0, 1, 0, 14 - -- help button - helpButton = createMenuButton( - UDim2.new 0, 15, 0, 17), - UDim2.new(1, -51, 0.5, -8), - "?", - Enum.FontSize.Size14, - "HelpButton", - dragBar - ) - helpFrame = Instance.new "Frame" - helpFrame.Name = "HelpFrame" - helpFrame.BackgroundColor3 = Color3.new 0, 0, 0 - helpFrame.Size = UDim2.new 0, 300, 0, 552) - helpFrame.Position = UDim2.new(1, 5, 0, 0) - helpFrame.Active = true - helpFrame.BorderSizePixel = 0 - helpFrame.Visible = false - helpFrame.Parent = dragBar - - helpButton.MouseButton1Click\connect -> - helpFrame.Visible = not helpFrame.Visible - if helpFrame.Visible - helpButton.Selected = true - helpButton.BackgroundTransparency = 0 - screenGui = getScreenGuiAncestor(helpFrame) - if screenGui - if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X then --position on left hand side - helpFrame.Position = UDim2.new 0, -5 - helpFrame.AbsoluteSize.X, 0, 0) - else -- position on right hand side - helpFrame.Position = UDim2.new(1, 5, 0, 0) - - else - helpFrame.Position = UDim2.new(1, 5, 0, 0) - + * New "Frame", "MinimizeFrame" + BackgroundColor3: Color3.new 73 / 255, 73 / 255, 73 / 255 + BorderColor3: Color3.new 0, 0, 0 + Position: UDim2.new 0, 0, 1, 0 + Size: if size + UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + UDim2.new 0, 20, 0, 0 else - helpButton.Selected = false - helpButton.BackgroundTransparency = 1 + UDim2.new 0, 183, 0, 50 + Visible: false + * New "TextButton", "MinimizeButton" + Position: UDim2.new 0.5, -50, 0.5, -20 + Size: UDim2.new 0, 100, 0, 40 + Style: Enum.ButtonStyle.RobloxButton + Font: Enum.Font.ArialBold + FontSize: Enum.FontSize.Size18 + TextColor3: Color3.new 1, 1, 1 + Text: "Show" - - minimizeButton = createMenuButton( - UDim2.new 0, 16, 0, 17), - UDim2.new(1, -34, 0.5, -8), - "-", - Enum.FontSize.Size14, - "MinimizeButton", - dragBar - ) - minimizeButton.TextYAlignment = Enum.TextYAlignment.Top - - minimizeFrame = Instance.new "Frame" - minimizeFrame.Name = "MinimizeFrame" - minimizeFrame.BackgroundColor3 = Color3.new(73 / 255, 73 / 255, 73 / 255) - minimizeFrame.BorderColor3 = Color3.new 0, 0, 0 - minimizeFrame.Position = UDim2.new 0, 0, 1, 0) - if size - minimizeFrame.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + UDim2.new 0, 20, 0, 0) - else - minimizeFrame.Size = UDim2.new 0, 183, 0, 50) - minimizeFrame.Visible = false - minimizeFrame.Parent = dragBar - - minimizeBigButton = Instance.new "TextButton" - minimizeBigButton.Position = UDim2.new 0.5, -50, 0.5, -20) - minimizeBigButton.Name = "MinimizeButton" - minimizeBigButton.Size = UDim2.new 0, 100, 0, 40) - minimizeBigButton.Style = Enum.ButtonStyle.RobloxButton - minimizeBigButton.Font = Enum.Font.ArialBold - minimizeBigButton.FontSize = Enum.FontSize.Size18 - minimizeBigButton.TextColor3 = Color3.new 1, 1, 1 - minimizeBigButton.Text = "Show" - minimizeBigButton.Parent = minimizeFrame - - separatingLine = Instance.new "Frame" - separatingLine.Name = "SeparatingLine" - separatingLine.BackgroundColor3 = Color3.new(115 / 255, 115 / 255, 115 / 255) - separatingLine.BorderSizePixel = 0 - separatingLine.Position = UDim2.new(1, -18, 0.5, -7) - separatingLine.Size = UDim2.new 0, 1, 0, 14) - separatingLine.Parent = dragBar - - otherSeparatingLine = separatingLine\clone! - otherSeparatingLine.Position = UDim2.new(1, -35, 0.5, -7) - otherSeparatingLine.Parent = dragBar - - widgetContainer = Instance.new "Frame" - widgetContainer.Name = "WidgetContainer" - widgetContainer.BackgroundTransparency = 1 - widgetContainer.Position = UDim2.new 0, 0, 1, 0) - widgetContainer.BorderColor3 = Color3.new 0, 0, 0 - if not scrollable - widgetContainer.BackgroundTransparency = 0 - widgetContainer.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) - widgetContainer.Parent = dragBar - - if size - if scrollable - widgetContainer.Size = size - else - widgetContainer.Size = UDim2.new 0, dragBar.AbsoluteSize.X, size.Y.Scale, size.Y.Offset) - - else - if scrollable - widgetContainer.Size = UDim2.new 0, 163, 0, 400) - else - widgetContainer.Size = UDim2.new 0, dragBar.AbsoluteSize.X, 0, 400) - + with dragBar if position - widgetContainer.Position += UDim2.new 0, 0, 0, 20) + .Position = position + + --.Visible = false + .MouseEnter\connect -> + .BackgroundColor3 = Color3.new 49 / 255, 49 / 255, 49 / 255 + + .MouseLeave\connect -> + .BackgroundColor3 = Color3.new 39 / 255, 39 / 255, 39 / 255 + + .Parent = parent + + -- close button + closeButton = createMenuButton( + UDim2.new(0, 15, 0, 17), + UDim2.new(1, -16, 0.5, -8), + "X", + Enum.FontSize.Size14, + "CloseButton", + dragBar + ) + closeEvent = New "BindableEvent", "CloseEvent" + Parent: closeButton + + closeButton.MouseButton1Click\connect -> + closeEvent\Fire! + closeButton.BackgroundTransparency = 1 + + -- help button + helpButton = createMenuButton( + UDim2.new(0, 15, 0, 17), + UDim2.new(1, -51, 0.5, -8), + "?", + Enum.FontSize.Size14, + "HelpButton", + dragBar + ) + + { -- Destructure + HelpFrame: helpFrame + SeparatingLine: separatingLine + MinimizeFrame: minimizeFrame + MinimizeFrame: + MinimizeBigButton: minimizeBigButton + } = dragBar + + helpButton.MouseButton1Click\connect -> + helpFrame.Visible = not helpFrame.Visible + if helpFrame.Visible + helpButton.Selected = true + helpButton.BackgroundTransparency = 0 + screenGui = getScreenGuiAncestor helpFrame + if screenGui + if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X --position on left hand side + helpFrame.Position = UDim2.new 0, -5 - helpFrame.AbsoluteSize.X, 0, 0 + else -- position on right hand side + helpFrame.Position = UDim2.new 1, 5, 0, 0 - local frame, control, verticalDragger = nil - if scrollable - --frame for widgets - frame, control = t.CreateTrueScrollingFrame() - frame.Size = UDim2.new(1, 0, 1, 0) - frame.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) - frame.BorderColor3 = Color3.new 0, 0, 0 - frame.Active = true - frame.Parent = widgetContainer - control.Parent = dragBar - control.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) - control.BorderSizePixel = 0 - control.BackgroundTransparency = 0 - control.Position = UDim2.new(1, -21, 1, 1) - if size - control.Size = UDim2.new 0, 21, size.Y.Scale, size.Y.Offset) else - control.Size = UDim2.new 0, 21, 0, 400) + helpFrame.Position = UDim2.new 1, 5, 0, 0 + else + helpButton.Selected = false + helpButton.BackgroundTransparency = 1 - control:FindFirstChild("ScrollDownButton").Position = UDim2.new 0, 0, 1, -20) + minimizeButton = createMenuButton( + UDim2.new(0, 16, 0, 17), + UDim2.new(1, -34, 0.5, -8), + "-", + Enum.FontSize.Size14, + "MinimizeButton", + dragBar + ) + minimizeButton.TextYAlignment = Enum.TextYAlignment.Top - fakeLine = Instance.new "Frame" - fakeLine.Name = "FakeLine" - fakeLine.BorderSizePixel = 0 - fakeLine.BackgroundColor3 = Color3.new 0, 0, 0 - fakeLine.Size = UDim2.new 0, 1, 1, 1) - fakeLine.Position = UDim2.new(1, 0, 0, 0) - fakeLine.Parent = control + with separatingLine\clone! + .Position = UDim2.new 1, -35, 0.5, -7 + .Parent = dragBar - verticalDragger = Instance.new "TextButton" - verticalDragger.ZIndex = 2 - verticalDragger.AutoButtonColor = false - verticalDragger.Name = "VerticalDragger" - verticalDragger.BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255) - verticalDragger.BorderColor3 = Color3.new 0, 0, 0 - verticalDragger.Size = UDim2.new(1, 20, 0, 20) - verticalDragger.Position = UDim2.new 0, 0, 1, 0) - verticalDragger.Active = true - verticalDragger.Text = "" - verticalDragger.Parent = widgetContainer + widgetContainer = New "Frame", "WidgetContainer" + BackgroundTransparency: 1 + Position: UDim2.new 0, 0, 1, 0 + BorderColor3: Color3.new 0, 0, 0 - scrubFrame = Instance.new "Frame" - scrubFrame.Name = "ScrubFrame" - scrubFrame.BackgroundColor3 = Color3.new 1, 1, 1 - scrubFrame.BorderSizePixel = 0 - scrubFrame.Position = UDim2.new 0.5, -5, 0.5, 0) - scrubFrame.Size = UDim2.new 0, 10, 0, 1) - scrubFrame.ZIndex = 5 - scrubFrame.Parent = verticalDragger - scrubTwo = scrubFrame\clone! - scrubTwo.Position = UDim2.new 0.5, -5, 0.5, -2) - scrubTwo.Parent = verticalDragger - scrubThree = scrubFrame\clone! - scrubThree.Position = UDim2.new 0.5, -5, 0.5, 2) - scrubThree.Parent = verticalDragger + * New "TextButton", "VerticalDragger" + ZIndex: 2 + AutoButtonColor: false + BackgroundColor3: Color3.new 50 / 255, 50 / 255, 50 / 255 + BorderColor3: Color3.new 0, 0, 0 + Size: UDim2.new 1, 20, 0, 20 + Position: UDim2.new 0, 0, 1, 0 + Active: true + Text: "" - areaSoak = Instance.new "TextButton" - areaSoak.Name = "AreaSoak" - areaSoak.Size = UDim2.new(1, 0, 1, 0) - areaSoak.BackgroundTransparency = 1 - areaSoak.BorderSizePixel = 0 - areaSoak.Text = "" - areaSoak.ZIndex = 10 - areaSoak.Visible = false - areaSoak.Active = true - areaSoak.Parent = getScreenGuiAncestor(parent) + * New "Frame", "ScrubFrame" + BackgroundColor3: Color3.new 1, 1, 1 + BorderSizePixel: 0 + Position: UDim2.new 0.5, -5, 0.5, 0 + Size: UDim2.new 0, 10, 0, 1 + ZIndex: 5 - draggingVertical = false - startYPos = nil - verticalDragger.MouseEnter\connect -> - verticalDragger.BackgroundColor3 = Color3.new(60 / 255, 60 / 255, 60 / 255) -) - verticalDragger.MouseLeave\connect -> - verticalDragger.BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255) -) - verticalDragger.MouseButton1Down\connect(function(_, y) + { -- Destructure + VerticalDragger: verticalDragger + VerticalDragger: + ScrubFrame: scrubFrame + } = widgetContainer + + if not scrollable + widgetContainer.BackgroundTransparency = 0 + widgetContainer.BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255 + + widgetContainer.Parent = dragBar + + if size + widgetContainer.Size = if scrollable + size + else + UDim2.new 0, dragBar.AbsoluteSize.X, size.Y.Scale, size.Y.Offset + + else + widgetContainer.Size = UDim2.new if scrollable + 0, 163, 0, 400 + else + 0, dragBar.AbsoluteSize.X, 0, 400 + + if position + widgetContainer.Position = position + UDim2.new 0, 0, 0, 20 + + local frame, control + if scrollable + --frame for widgets + frame, control = t.CreateTrueScrollingFrame! + + with frame + .Size = UDim2.new 1, 0, 1, 0 + .BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255 + .BorderColor3 = Color3.new 0, 0, 0 + .Active = true + .Parent = widgetContainer + with control + .BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255 + .BorderSizePixel = 0 + .BackgroundTransparency = 0 + .Position = UDim2.new 1, -21, 1, 1 + .Size = UDim2.new 0, 21, if size + size.Y.Scale, size.Y.Offset + else + 0, 400 + \FindFirstChild("ScrollDownButton").Position = UDim2.new 0, 0, 1, -20 + + .Parent = dragBar + + New "Frame", "FakeLine" + BorderSizePixel: 0 + BackgroundColor3: Color3.new 0, 0, 0 + Size: UDim2.new 0, 1, 1, 1 + Position: UDim2.new 1, 0, 0, 0 + Parent: control + + for _ = 1, 2 + with scrubFrame\clone! + .Position = UDim2.new 0.5, -5, 0.5, 2 + .Parent = verticalDragger + + areaSoak = New "TextButton", "AreaSoak" + Size: UDim2.new 1, 0, 1, 0 + BackgroundTransparency: 1 + BorderSizePixel: 0 + Text: "" + ZIndex: 10 + Visible: false + Active: true + Parent: getScreenGuiAncestor parent + + draggingVertical = false + local startYPos + + with verticalDragger + .MouseEnter\connect -> + .BackgroundColor3 = Color3.new 60 / 255, 60 / 255, 60 / 255 + .MouseLeave\connect -> + .BackgroundColor3 = Color3.new 50 / 255, 50 / 255, 50 / 255 + .MouseButton1Down\connect (_, y) -> draggingVertical = true areaSoak.Visible = true startYPos = y -) - areaSoak.MouseButton1Up\connect -> - draggingVertical = false - areaSoak.Visible = false -) - areaSoak.MouseMoved\connect(function(_, y) - if not draggingVertical - return + + areaSoak.MouseButton1Up\connect -> + draggingVertical = false + areaSoak.Visible = false + areaSoak.MouseMoved\connect (_, y) -> + return if not draggingVertical + + yDelta = y - startYPos + return if not control.ScrollDownButton.Visible and yDelta > 0 - yDelta = y - startYPos - if not control.ScrollDownButton.Visible and yDelta > 0 - return + if (widgetContainer.Size.Y.Offset + yDelta) < 150 + widgetContainer.Size = UDim2.new( + widgetContainer.Size.X.Scale, + widgetContainer.Size.X.Offset, + widgetContainer.Size.Y.Scale, + 150 + ) + control.Size = UDim2.new 0, 21, 0, 150 + return + startYPos = y - if (widgetContainer.Size.Y.Offset + yDelta) < 150 - widgetContainer.Size = UDim2.new( - widgetContainer.Size.X.Scale, - widgetContainer.Size.X.Offset, - widgetContainer.Size.Y.Scale, - 150 - ) - control.Size = UDim2.new 0, 21, 0, 150) - return - - - startYPos = y - - if widgetContainer.Size.Y.Offset + yDelta >= 0 - widgetContainer.Size = UDim2.new( - widgetContainer.Size.X.Scale, - widgetContainer.Size.X.Offset, - widgetContainer.Size.Y.Scale, - widgetContainer.Size.Y.Offset + yDelta - ) - control.Size = UDim2.new 0, 21, 0, control.Size.Y.Offset + yDelta) - -) - - switchMinimize = () - minimizeFrame.Visible = not minimizeFrame.Visible - if scrollable - frame.Visible = not frame.Visible - verticalDragger.Visible = not verticalDragger.Visible - control.Visible = not control.Visible - else - widgetContainer.Visible = not widgetContainer.Visible - - - if minimizeFrame.Visible - minimizeButton.Text = "+" - else - minimizeButton.Text = "-" - - - minimizeBigButton.MouseButton1Click\connect -> - switchMinimize() - - - minimizeButton.MouseButton1Click\connect -> - switchMinimize() - + if widgetContainer.Size.Y.Offset + yDelta >= 0 + widgetContainer.Size = UDim2.new( + widgetContainer.Size.X.Scale, + widgetContainer.Size.X.Offset, + widgetContainer.Size.Y.Scale, + widgetContainer.Size.Y.Offset + yDelta + ) + control.Size = UDim2.new 0, 21, 0, control.Size.Y.Offset + yDelta + switchMinimize = -> + minimizeFrame.Visible = not minimizeFrame.Visible if scrollable - return dragBar, frame, helpFrame, closeEvent + frame.Visible = not frame.Visible + verticalDragger.Visible = not verticalDragger.Visible + control.Visible = not control.Visible else - return dragBar, widgetContainer, helpFrame, closeEvent - end + widgetContainer.Visible = not widgetContainer.Visible - t.Help = function(funcNameOrFunc) - --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu - return "Function CreatePropertyDropDownMenu. " - .. "Arguments: (instance, propertyName, enumType). " - .. "Side effect: returns a container with a drop-down-box that is linked to the 'property' field of 'instance' which is of type 'enumType'" - if funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu - return "Function CreateDropDownMenu. " - .. "Arguments: (items, onItemSelected). " - .. "Side effect: Returns 2 results, a container to the gui object and a 'updateSelection' function for external updating. The container is a drop-down-box created around a list of items" - if funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog - return "Function CreateMessageDialog. " - .. "Arguments: (title, message, buttons). " - .. "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button" - if funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog - return "Function CreateStyledMessageDialog. " - .. "Arguments: (title, message, style, buttons). " - .. "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button, 'style' is a string, either Error, Notify or Confirm" - if funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight - return "Function GetFontHeight. " - .. "Arguments: (font, fontSize). " - .. "Side effect: returns the size in pixels of the given font + fontSize" - if funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame - return "Function CreateScrollingFrame. " - .. "Arguments: (orderList, style) " - .. "Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). 'scrollFrame' can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a 'grid' styling if style is passed 'grid' as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)" - if funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame - return "Function CreateTrueScrollingFrame. " - .. "Arguments: (nil) " - .. "Side effect: returns 2 objects, (scrollFrame, controlFrame). 'scrollFrame' can be filled with GuiObjects, and they will be clipped if not inside the frame's bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit." - if funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject - return "Function AutoTruncateTextObject. " - .. "Arguments: (textLabel) " - .. "Side effect: returns 2 objects, (textLabel, changeText). The 'textLabel' input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. 'changeText' is a function that can be used to change the text, it takes 1 string as an argument" - if funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider - return "Function CreateSlider. " - .. "Arguments: (steps, width, position) " - .. "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." - if funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame - return "Function CreateLoadingFrame. " - .. "Arguments: (name, size, position) " - .. "Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that when fired means that someone clicked the cancel button on the dialog." - if funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector - return "Function CreateTerrainMaterialSelector. " - .. "Arguments: (size, position) " - .. "Side effect: Size and position are UDim2 values that specifies the selector's size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected." - end + minimizeButton.Text = if minimizeFrame.Visible + "+" + else + "-" - return t -]] \ No newline at end of file + minimizeBigButton.MouseButton1Click\connect switchMinimize + minimizeButton.MouseButton1Click\connect switchMinimize + + return dragBar, if scrollable + frame, helpFrame, closeEvent + else + widgetContainer, helpFrame, closeEvent + +t.Help = (funcNameOrFunc) -> + --input argument can be a string or a function. Should return a description (of arguments and expected side effects) + switch funcNameOrFunc + when 'CreatePropertyDropDownMenu', t.CreatePropertyDropDownMenu + 'Function CreatePropertyDropDownMenu. ' .. + 'Arguments: (instance, propertyName, enumType). ' .. + 'Side effect: returns a container with a drop-down-box that is linked to the "property" field of "instance" which is of type "enumType"' + + when 'CreateDropDownMenu', t.CreateDropDownMenu + 'Function CreateDropDownMenu. ' .. + 'Arguments: (items, onItemSelected). ' .. + 'Side effect: Returns 2 results, a container to the gui object and a "updateSelection" function for external updating. The container is a drop-down-box created around a list of items' + + when 'CreateMessageDialog', t.CreateMessageDialog + 'Function CreateMessageDialog. ' .. + 'Arguments: (title, message, buttons). ' .. + 'Side effect: Returns a gui object of a message box with "title" and "message" as passed in. "buttons" input is an array of Tables contains a "Text" and "Function" field for the text/callback of each button' + + when 'CreateStyledMessageDialog', t.CreateStyledMessageDialog + 'Function CreateStyledMessageDialog. ' .. + 'Arguments: (title, message, style, buttons). ' .. + 'Side effect: Returns a gui object of a message box with "title" and "message" as passed in. "buttons" input is an array of Tables contains a "Text" and "Function" field for the text/callback of each button, "style" is a string, either Error, Notify or Confirm' + + when 'GetFontHeight', t.GetFontHeight + 'Function GetFontHeight. ' .. + 'Arguments: (font, fontSize). ' .. + 'Side effect: returns the size in pixels of the given font + fontSize' + + when 'CreateScrollingFrame', t.CreateScrollingFrame + 'Function CreateScrollingFrame. ' .. + 'Arguments: (orderList, style) ' .. + 'Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). "scrollFrame" can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a "grid" styling if style is passed "grid" as a string. recalculateFunction can be called + when a relayout is needed ( + when orderList changes)' + + when 'CreateTrueScrollingFrame', t.CreateTrueScrollingFrame + 'Function CreateTrueScrollingFrame. ' .. + 'Arguments: (nil) ' .. + 'Side effect: returns 2 objects, (scrollFrame, controlFrame). "scrollFrame" can be filled with GuiObjects, and they will be clipped if not inside the frame"s bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit.' + + when 'AutoTruncateTextObject', t.AutoTruncateTextObject + 'Function AutoTruncateTextObject. ' .. + 'Arguments: (textLabel) ' .. + 'Side effect: returns 2 objects, (textLabel, changeText). The "textLabel" input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. "changeText" is a function that can be used to change the text, it takes 1 string as an argument' + + when 'CreateSlider', t.CreateSlider + 'Function CreateSlider. ' .. + 'Arguments: (steps, width, position) ' .. + 'Side effect: returns 2 objects, (sliderGui, sliderPosition). The "steps" argument specifies how many different positions the slider can hold along the bar. "width" specifies in pixels how wide the bar should be (modifiable afterwards if desired). "position" argument should be a UDim2 for slider positioning. "sliderPosition" is an IntValue whose current .Value specifies the specific step the slider is currently on.' + + when 'CreateLoadingFrame', t.CreateLoadingFrame + 'Function CreateLoadingFrame. ' .. + 'Arguments: (name, size, position) ' .. + 'Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that + when fired means that someone clicked the cancel button on the dialog.' + + when 'CreateTerrainMaterialSelector', t.CreateTerrainMaterialSelector + 'Function CreateTerrainMaterialSelector. ' .. + 'Arguments: (size, position) ' .. + 'Side effect: Size and position are UDim2 values that specifies the selector"s size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected.' + +-- Thanks RbxGui, that was unbelievably tedious to port +-- Heliodex diff --git a/yue/48488398.lua b/yue/48488398.lua new file mode 100644 index 0000000..e5bfc62 --- /dev/null +++ b/yue/48488398.lua @@ -0,0 +1,234 @@ +local waitForProperty +waitForProperty = function(instance, property) + while not instance[property] do + instance.Changed:wait() + end +end +local waitForChild +waitForChild = function(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end +end +waitForProperty(game.Players, "LocalPlayer") +waitForChild(script.Parent, "Popup") +waitForChild(script.Parent.Popup, "AcceptButton") +script.Parent.Popup.AcceptButton.Modal = true +local localPlayer = game.Players.LocalPlayer +local teleportUI +local friendRequestBlacklist = { } +local teleportEnabled = true +local showOneButton +showOneButton = function() + local popup = script.Parent:FindFirstChild("Popup") + if popup then + popup.OKButton.Visible = true + popup.DeclineButton.Visible = false + popup.AcceptButton.Visible = false + end + return popup +end +local showTwoButtons +showTwoButtons = function() + local popup = script.Parent:FindFirstChild("Popup") + if popup then + popup.OKButton.Visible = false + popup.DeclineButton.Visible = true + popup.AcceptButton.Visible = true + end + return popup +end +local makePopupInvisible +makePopupInvisible = function() + if script.Parent.Popup then + script.Parent.Popup.Visible = false + end +end +local makeFriend +makeFriend = function(fromPlayer, toPlayer) + local popup = script.Parent:FindFirstChild("Popup") + if not (popup ~= nil) then + return + end + if popup.Visible then + return + end + if friendRequestBlacklist[fromPlayer] then + return + end + popup.PopupText.Text = "Accept Friend Request from " .. tostring(fromPlayer.Name) .. "?" + popup.PopupImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=352&y=352" + showTwoButtons() + popup.Visible = true + popup.AcceptButton.Text = "Accept" + popup.DeclineButton.Text = "Decline" + popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + local yesCon, noCon + yesCon = popup.AcceptButton.MouseButton1Click:connect(function() + popup.Visible = false + toPlayer:RequestFriendship(fromPlayer) + if yesCon ~= nil then + yesCon:disconnect() + end + if noCon ~= nil then + noCon:disconnect() + end + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end) + noCon = popup.DeclineButton.MouseButton1Click:connect(function() + popup.Visible = false + toPlayer:RevokeFriendship(fromPlayer) + friendRequestBlacklist[fromPlayer] = true + print("pop up blacklist") + if yesCon ~= nil then + yesCon:disconnect() + end + if noCon ~= nil then + noCon:disconnect() + end + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end) +end +game.Players.FriendRequestEvent:connect(function(fromPlayer, toPlayer, event) + if fromPlayer ~= localPlayer and toPlayer ~= localPlayer then + return + end + if fromPlayer == localPlayer then + if event == Enum.FriendRequestEvent.Accept then + return game:GetService("GuiService"):SendNotification("You are Friends", "With " .. tostring(toPlayer.Name) .. "!", "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(toPlayer.userId) .. "&x=48&y=48", 5, function() end) + end + elseif toPlayer == localPlayer then + if event == Enum.FriendRequestEvent.Issue then + if friendRequestBlacklist[fromPlayer] then + return + end + return game:GetService("GuiService"):SendNotification("Friend Request", "From " .. tostring(fromPlayer.Name), "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48", 8, function() + return makeFriend(fromPlayer, toPlayer) + end) + elseif event == Enum.FriendRequestEvent.Accept then + return game:GetService("GuiService"):SendNotification("You are Friends", "With " .. tostring(fromPlayer.Name) .. "!", "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48", 5, function() end) + end + end +end) +local showTeleportUI +showTeleportUI = function(message, timer) + if teleportUI ~= nil then + teleportUI:Remove() + end + waitForChild(localPlayer, "PlayerGui") + local _with_0 = Instance.new("Message") + _with_0.Text = message + _with_0.Parent = localPlayer.PlayerGui + if timer > 0 then + wait(timer) + _with_0:Remove() + end + return _with_0 +end +local onTeleport +onTeleport = function(teleportState, _, _) + if game:GetService("TeleportService").CustomizedTeleportUI == false then + return showTeleportUI((function() + if Enum.TeleportState.Started == teleportState then + return "Teleport started...", 0 + elseif Enum.TeleportState.WaitingForServer == teleportState then + return "Requesting server...", 0 + elseif Enum.TeleportState.InProgress == teleportState then + return "Teleporting...", 0 + elseif Enum.TeleportState.Failed == teleportState then + return "Teleport failed. Insufficient privileges or target place does not exist.", 3 + end + end)()) + end +end +if teleportEnabled then + localPlayer.OnTeleport:connect(onTeleport) + game:GetService("TeleportService").ErrorCallback = function(message) + local popup = script.Parent:FindFirstChild("Popup") + showOneButton() + popup.PopupText.Text = message + local clickCon + clickCon = popup.OKButton.MouseButton1Click:connect(function() + game:GetService("TeleportService"):TeleportCancel() + if clickCon then + clickCon:disconnect() + end + game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild("Popup")) + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end) + return game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup", Enum.CenterDialogType.QuitDialog), function() + showOneButton() + script.Parent:FindFirstChild("Popup").Visible = true + return popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + end, function() + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end) + end + game:GetService("TeleportService").ConfirmationCallback = function(message, placeId, spawnName) + local popup = script.Parent:FindFirstChild("Popup") + popup.PopupText.Text = message + popup.PopupImage.Image = "" + local yesCon, noCon + local killCons + killCons = function() + if yesCon ~= nil then + yesCon:disconnect() + end + if noCon ~= nil then + noCon:disconnect() + end + game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild("Popup")) + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end + yesCon = popup.AcceptButton.MouseButton1Click:connect(function() + killCons() + local success, err + success, err = pcall(function() + return game:GetService("TeleportService"):TeleportImpl(placeId, spawnName) + end) + if not success then + showOneButton() + popup.PopupText.Text = err + local clickCon + clickCon = popup.OKButton.MouseButton1Click:connect(function() + if clickCon ~= nil then + clickCon:disconnect() + end + game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild("Popup")) + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end) + return game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup", Enum.CenterDialogType.QuitDialog), function() + showOneButton() + script.Parent:FindFirstChild("Popup").Visible = true + return popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + end, function() + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end) + end + end) + noCon = popup.DeclineButton.MouseButton1Click:connect(function() + killCons() + return pcall(function() + return game:GetService("TeleportService"):TeleportCancel() + end) + end) + local centerDialogSuccess = pcall(function() + return game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup", Enum.CenterDialogType.QuitDialog), function() + showTwoButtons() + popup.AcceptButton.Text = "Leave" + popup.DeclineButton.Text = "Stay" + script.Parent:FindFirstChild("Popup").Visible = true + return popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + end, function() + return popup:TweenSize(UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true, makePopupInvisible()) + end) + end) + if centerDialogSuccess == false then + script.Parent:FindFirstChild("Popup").Visible = true + popup.AcceptButton.Text = "Leave" + popup.DeclineButton.Text = "Stay" + popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + end + return true + end +end diff --git a/yue/48488398.yue b/yue/48488398.yue index e69de29..fafc192 100644 --- a/yue/48488398.yue +++ b/yue/48488398.yue @@ -0,0 +1,294 @@ +waitForProperty = (instance, property) -> + until instance[property] + instance.Changed\wait! + +waitForChild = (instance, name) -> + until instance\FindFirstChild name + instance.ChildAdded\wait! + +waitForProperty game.Players, "LocalPlayer" +waitForChild script.Parent, "Popup" +waitForChild script.Parent.Popup, "AcceptButton" +script.Parent.Popup.AcceptButton.Modal = true + +localPlayer = game.Players.LocalPlayer +local teleportUI + +friendRequestBlacklist = {} + +teleportEnabled = true + +showOneButton = -> + with popup = script.Parent\FindFirstChild "Popup" + if popup + .OKButton.Visible = true + .DeclineButton.Visible = false + .AcceptButton.Visible = false + +showTwoButtons = -> + with popup = script.Parent\FindFirstChild "Popup" + if popup + .OKButton.Visible = false + .DeclineButton.Visible = true + .AcceptButton.Visible = true + +makePopupInvisible = -> + if script.Parent.Popup + script.Parent.Popup.Visible = false + +makeFriend = (fromPlayer, toPlayer) -> + popup = script.Parent\FindFirstChild "Popup" + return if not popup? -- there is no popup! + return if popup.Visible -- currently popping something, abort! + return if friendRequestBlacklist[fromPlayer] -- previously cancelled friend request, we don't want it! + + with popup + .PopupText.Text = "Accept Friend Request from #{fromPlayer.Name}?" + .PopupImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?userId=#{fromPlayer.userId}&x=352&y=352" + + showTwoButtons! + .Visible = true + .AcceptButton.Text = "Accept" + .DeclineButton.Text = "Decline" + \TweenSize UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true + + local yesCon, noCon + + yesCon = popup.AcceptButton.MouseButton1Click\connect -> + popup.Visible = false + toPlayer\RequestFriendship fromPlayer + + yesCon?\disconnect! + noCon?\disconnect! + + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + + noCon = popup.DeclineButton.MouseButton1Click\connect -> + popup.Visible = false + toPlayer\RevokeFriendship fromPlayer + friendRequestBlacklist[fromPlayer] = true + print "pop up blacklist" + + yesCon?\disconnect! + noCon?\disconnect! + + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + +game.Players.FriendRequestEvent\connect (fromPlayer, toPlayer, event) -> + -- if this doesn't involve me, then do nothing + return if fromPlayer ~= localPlayer and toPlayer ~= localPlayer + + if fromPlayer == localPlayer + if event == Enum.FriendRequestEvent.Accept + game\GetService("GuiService")\SendNotification( + "You are Friends", + "With #{toPlayer.Name}!", + "http://www.roblox.com/thumbs/avatar.ashx?userId=#{toPlayer.userId}&x=48&y=48", + 5, + -> + ) + elseif toPlayer == localPlayer + if event == Enum.FriendRequestEvent.Issue + if friendRequestBlacklist[fromPlayer] + return + -- previously cancelled friend request, we don't want it! + game\GetService("GuiService")\SendNotification( + "Friend Request", + "From #{fromPlayer.Name}", + "http://www.roblox.com/thumbs/avatar.ashx?userId=#{fromPlayer.userId}&x=48&y=48", + 8, + -> makeFriend fromPlayer, toPlayer + ) + elseif event == Enum.FriendRequestEvent.Accept + game\GetService("GuiService")\SendNotification( + "You are Friends", + "With #{fromPlayer.Name}!", + "http://www.roblox.com/thumbs/avatar.ashx?userId=#{fromPlayer.userId}&x=48&y=48", + 5, + -> + ) + +showTeleportUI = (message, timer) -> + + teleportUI?\Remove! + waitForChild localPlayer, "PlayerGui" + + with Instance.new "Message" + .Text = message + .Parent = localPlayer.PlayerGui + if timer > 0 + wait timer + \Remove! + +onTeleport = (teleportState, _, _) -> + if game\GetService("TeleportService").CustomizedTeleportUI == false + showTeleportUI switch teleportState + when Enum.TeleportState.Started + "Teleport started...", 0 + when Enum.TeleportState.WaitingForServer + "Requesting server...", 0 + when Enum.TeleportState.InProgress + "Teleporting...", 0 + when Enum.TeleportState.Failed + "Teleport failed. Insufficient privileges or target place does not exist.", 3 + +if teleportEnabled + localPlayer.OnTeleport\connect onTeleport + + game\GetService("TeleportService").ErrorCallback = (message) -> + popup = script.Parent\FindFirstChild "Popup" + showOneButton! + popup.PopupText.Text = message + local clickCon + clickCon = popup.OKButton.MouseButton1Click\connect -> + game\GetService("TeleportService")\TeleportCancel! + if clickCon + clickCon\disconnect! + game.GuiService\RemoveCenterDialog script.Parent\FindFirstChild "Popup" + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + game.GuiService\AddCenterDialog( + script.Parent\FindFirstChild "Popup", + Enum.CenterDialogType.QuitDialog, + --ShowFunction + -> + showOneButton! + script.Parent\FindFirstChild("Popup").Visible = true + popup\TweenSize UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true + --HideFunction + -> + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + ) + game\GetService("TeleportService").ConfirmationCallback = (message, placeId, spawnName) -> + popup = script.Parent\FindFirstChild "Popup" + popup.PopupText.Text = message + popup.PopupImage.Image = "" + + local yesCon, noCon + + killCons = -> + yesCon?\disconnect! + noCon?\disconnect! + + game.GuiService\RemoveCenterDialog script.Parent\FindFirstChild "Popup" + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + + yesCon = popup.AcceptButton.MouseButton1Click\connect -> + killCons! + local success, err = try + game\GetService("TeleportService")\TeleportImpl placeId, spawnName + if not success + showOneButton! + popup.PopupText.Text = err + local clickCon = popup.OKButton.MouseButton1Click\connect -> + clickCon?\disconnect! + game.GuiService\RemoveCenterDialog script.Parent\FindFirstChild "Popup" + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + game.GuiService\AddCenterDialog( + script.Parent\FindFirstChild "Popup", + Enum.CenterDialogType.QuitDialog, + --ShowFunction + -> + showOneButton! + script.Parent\FindFirstChild("Popup").Visible = true + popup\TweenSize( + UDim2.new(0, 330, 0, 350), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true + ) + --HideFunction + -> + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + ) + + noCon = popup.DeclineButton.MouseButton1Click\connect -> + killCons! + try + game\GetService("TeleportService")\TeleportCancel! + + centerDialogSuccess = try + game.GuiService\AddCenterDialog( + script.Parent\FindFirstChild "Popup", + Enum.CenterDialogType.QuitDialog, + --ShowFunction + -> + showTwoButtons! + popup.AcceptButton.Text = "Leave" + popup.DeclineButton.Text = "Stay" + script.Parent\FindFirstChild("Popup").Visible = true + popup\TweenSize( + UDim2.new(0, 330, 0, 350), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true + ) + --HideFunction + -> + popup\TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible! + ) + ) + + if centerDialogSuccess == false + script.Parent\FindFirstChild("Popup").Visible = true + popup.AcceptButton.Text = "Leave" + popup.DeclineButton.Text = "Stay" + popup\TweenSize UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true + + true