3536 lines
111 KiB
Lua
3536 lines
111 KiB
Lua
print("[Mercury]: Loaded corescript 45284430")
|
|
local New
|
|
New = function(className, name, props)
|
|
if not (props ~= nil) then
|
|
props = name
|
|
name = nil
|
|
end
|
|
local obj = Instance.new(className)
|
|
if name then
|
|
obj.Name = name
|
|
end
|
|
local parent
|
|
for k, v in pairs(props) do
|
|
if type(k) == "string" then
|
|
if k == "Parent" then
|
|
parent = v
|
|
else
|
|
obj[k] = v
|
|
end
|
|
elseif type(k) == "number" and type(v) == "userdata" then
|
|
v.Parent = obj
|
|
end
|
|
end
|
|
obj.Parent = parent
|
|
return obj
|
|
end
|
|
local t = { }
|
|
local ScopedConnect
|
|
ScopedConnect = function(parentInstance, instance, event, signalFunc, syncFunc, removeFunc)
|
|
local eventConnection
|
|
local tryConnect
|
|
tryConnect = function()
|
|
if game:IsAncestorOf(parentInstance) then
|
|
if not eventConnection then
|
|
eventConnection = instance[event]:connect(signalFunc)
|
|
if syncFunc then
|
|
return syncFunc()
|
|
end
|
|
end
|
|
else
|
|
if eventConnection then
|
|
eventConnection:disconnect()
|
|
if removeFunc then
|
|
return removeFunc()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local connection = parentInstance.AncestryChanged:connect(tryConnect)
|
|
tryConnect()
|
|
return connection
|
|
end
|
|
local getScreenGuiAncestor
|
|
getScreenGuiAncestor = function(instance)
|
|
local localInstance = instance
|
|
while localInstance and not localInstance:IsA("ScreenGui") do
|
|
localInstance = localInstance.Parent
|
|
end
|
|
return localInstance
|
|
end
|
|
local CreateButtons
|
|
CreateButtons = function(frame, buttons, yPos, ySize)
|
|
local buttonNum = 1
|
|
local buttonObjs = { }
|
|
for _, obj in ipairs(buttons) do
|
|
local button = New("TextButton", "Button" .. tostring(buttonNum), {
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
AutoButtonColor = true,
|
|
Modal = true,
|
|
Style = (function()
|
|
if obj["Style"] then
|
|
return obj.Style
|
|
else
|
|
return Enum.ButtonStyle.RobloxButton
|
|
end
|
|
end)(),
|
|
Text = obj.Text,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
MouseButton1Click = onnect(obj.Function),
|
|
Parent = frame
|
|
})
|
|
buttonObjs[buttonNum] = button
|
|
buttonNum = buttonNum + 1
|
|
end
|
|
local numButtons = buttonNum - 1
|
|
if numButtons == 1 then
|
|
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 then
|
|
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 then
|
|
local spacing = 0.1 / numButtons
|
|
local buttonSize = 0.9 / numButtons
|
|
buttonNum = 1
|
|
while buttonNum <= numButtons do
|
|
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 = buttonNum + 1
|
|
end
|
|
end
|
|
end
|
|
local setSliderPos
|
|
setSliderPos = function(newAbsPosX, slider, sliderPosition, bar, steps)
|
|
local newStep = steps - 1
|
|
local 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 then
|
|
wholeNum = wholeNum + 1
|
|
end
|
|
relativePosX = wholeNum / newStep
|
|
local result = math.ceil(relativePosX * newStep)
|
|
if sliderPosition.Value ~= (result + 1) then
|
|
sliderPosition.Value = result + 1
|
|
slider.Position = UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset)
|
|
end
|
|
end
|
|
local cancelSlide
|
|
cancelSlide = function(areaSoak)
|
|
areaSoak.Visible = false
|
|
if areaSoakMouseMoveCon then
|
|
return areaSoakMouseMoveCon:disconnect()
|
|
end
|
|
end
|
|
t.CreateStyledMessageDialog = function(title, message, style, buttons)
|
|
local frame = New("Frame", "MessageDialog", {
|
|
Size = UDim2.new(0.5, 0, 0, 165),
|
|
Position = UDim2.new(0.25, 0, 0.5, -72.5),
|
|
Active = true,
|
|
Style = Enum.FrameStyle.RobloxRound
|
|
})
|
|
local styleImage = New("ImageLabel", "StyleImage", {
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0, 5, 0, 15)
|
|
})
|
|
if style == "error" or style == "Error" then
|
|
styleImage.Size = UDim2.new(0, 71, 0, 71)
|
|
styleImage.Image = "http://www.roblox.com/asset?id=42565285"
|
|
elseif style == "notify" or style == "Notify" then
|
|
styleImage.Size = UDim2.new(0, 71, 0, 71)
|
|
styleImage.Image = "http://www.roblox.com/asset?id=42604978"
|
|
elseif style == "confirm" or style == "Confirm" then
|
|
styleImage.Size = UDim2.new(0, 74, 0, 76)
|
|
styleImage.Image = "http://www.roblox.com/asset?id=42557901"
|
|
else
|
|
return t.CreateMessageDialog(title, message, buttons)
|
|
end
|
|
styleImage.Parent = frame
|
|
local titleLabel = New("TextLabel", "Title", {
|
|
Text = title,
|
|
TextStrokeTransparency = 0,
|
|
BackgroundTransparency = 1,
|
|
TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255),
|
|
Position = UDim2.new(0, 80, 0, 0),
|
|
Size = UDim2.new(1, -80, 0, 40),
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size36,
|
|
TextXAlignment = Enum.TextXAlignment.Center,
|
|
TextYAlignment = Enum.TextYAlignment.Center,
|
|
Parent = frame
|
|
})
|
|
local messageLabel = New("TextLabel", "Message", {
|
|
Text = message,
|
|
TextStrokeTransparency = 0,
|
|
TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255),
|
|
Position = UDim2.new(0.025, 80, 0, 45),
|
|
Size = UDim2.new(0.95, -80, 0, 55),
|
|
BackgroundTransparency = 1,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
TextWrap = true,
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Top,
|
|
Parent = frame
|
|
})
|
|
CreateButtons(frame, buttons, UDim.new(0, 105), UDim.new(0, 40))
|
|
return frame
|
|
end
|
|
t.CreateMessageDialog = function(title, message, buttons)
|
|
local frame = New("Frame", "MessageDialog", {
|
|
Size = UDim2.new(0.5, 0, 0.5, 0),
|
|
Position = UDim2.new(0.25, 0, 0.25, 0),
|
|
Active = true,
|
|
Style = Enum.FrameStyle.RobloxRound
|
|
})
|
|
local titleLabel = New("TextLabel", "Title", {
|
|
Text = title,
|
|
BackgroundTransparency = 1,
|
|
TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255),
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
Size = UDim2.new(1, 0, 0.15, 0),
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size36,
|
|
TextXAlignment = Enum.TextXAlignment.Center,
|
|
TextYAlignment = Enum.TextYAlignment.Center,
|
|
Parent = frame
|
|
})
|
|
local messageLabel = New("TextLabel", "Message", {
|
|
Text = message,
|
|
TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255),
|
|
Position = UDim2.new(0.025, 0, 0.175, 0),
|
|
Size = UDim2.new(0.95, 0, 0.55, 0),
|
|
BackgroundTransparency = 1,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
TextWrap = true,
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Top,
|
|
Parent = frame
|
|
})
|
|
CreateButtons(frame, buttons, UDim.new(0.8, 0), UDim.new(0.15, 0))
|
|
return frame
|
|
end
|
|
t.CreateDropDownMenu = function(items, onSelect, forRoblox)
|
|
local width = UDim.new(0, 100)
|
|
local height = UDim.new(0, 32)
|
|
local frame = New("Frame", "DropDownMenu", {
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(width, height)
|
|
})
|
|
local dropDownMenu = New("TextButton", "DropDownMenuButton", {
|
|
TextWrap = true,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
Text = "Choose One",
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size18,
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Center,
|
|
BackgroundTransparency = 1,
|
|
AutoButtonColor = true,
|
|
Style = Enum.ButtonStyle.RobloxButton,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Parent = frame,
|
|
ZIndex = 2
|
|
})
|
|
local dropDownIcon = New("ImageLabel", "Icon", {
|
|
Active = false,
|
|
Image = "http://www.roblox.com/asset/?id=45732894",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0, 11, 0, 6),
|
|
Position = UDim2.new(1, -11, 0.5, -2),
|
|
Parent = dropDownMenu,
|
|
ZIndex = 2
|
|
})
|
|
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 choiceButton = New("TextButton", "ChoiceButton", {
|
|
BackgroundTransparency = 1,
|
|
BorderSizePixel = 0,
|
|
Text = "ReplaceMe",
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Center,
|
|
BackgroundColor3 = Color3.new(1, 1, 1),
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Size = (function()
|
|
if useScrollButtons then
|
|
return UDim2.new(1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0)
|
|
else
|
|
return UDim2.new(1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0)
|
|
end
|
|
end)(),
|
|
TextWrap = true,
|
|
ZIndex = 2
|
|
})
|
|
local areaSoak = New("TextButton", "AreaSoak", {
|
|
Text = "",
|
|
BackgroundTransparency = 1,
|
|
Active = true,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Visible = false,
|
|
ZIndex = 3
|
|
})
|
|
local dropDownSelected = false
|
|
local scrollUpButton
|
|
local scrollDownButton
|
|
local scrollMouseCount = 0
|
|
local setZIndex
|
|
setZIndex = function(baseZIndex)
|
|
droppedDownMenu.ZIndex = baseZIndex + 1
|
|
if scrollUpButton then
|
|
scrollUpButton.ZIndex = baseZIndex + 3
|
|
end
|
|
if scrollDownButton then
|
|
scrollDownButton.ZIndex = baseZIndex + 3
|
|
end
|
|
local children = droppedDownMenu:GetChildren()
|
|
if children then
|
|
for _, child in ipairs(children) do
|
|
if child.Name == "ChoiceButton" then
|
|
child.ZIndex = baseZIndex + 2
|
|
elseif child.Name == "ClickCaptureButton" then
|
|
child.ZIndex = baseZIndex
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local scrollBarPosition = 1
|
|
local updateScroll
|
|
updateScroll = function()
|
|
if scrollUpButton then
|
|
scrollUpButton.Active = scrollBarPosition > 1
|
|
end
|
|
if scrollDownButton then
|
|
scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount
|
|
end
|
|
local children = droppedDownMenu:GetChildren()
|
|
if not children then
|
|
return
|
|
end
|
|
local childNum = 1
|
|
for _, obj in ipairs(children) do
|
|
if obj.Name == "ChoiceButton" then
|
|
if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount then
|
|
obj.Visible = false
|
|
else
|
|
obj.Position = UDim2.new(0, 0, ((childNum - scrollBarPosition + 1) * 0.8) / ((dropDownItemCount + 1) * 0.8), 0)
|
|
obj.Visible = true
|
|
end
|
|
obj.TextColor3 = Color3.new(1, 1, 1)
|
|
obj.BackgroundTransparency = 1
|
|
childNum = childNum + 1
|
|
end
|
|
end
|
|
end
|
|
local toggleVisibility
|
|
toggleVisibility = function()
|
|
dropDownSelected = not dropDownSelected
|
|
areaSoak.Visible = not areaSoak.Visible
|
|
dropDownMenu.Visible = not dropDownSelected
|
|
droppedDownMenu.Visible = dropDownSelected
|
|
if dropDownSelected then
|
|
setZIndex(4)
|
|
else
|
|
setZIndex(2)
|
|
end
|
|
if useScrollButtons then
|
|
return updateScroll()
|
|
end
|
|
end
|
|
droppedDownMenu.MouseButton1Click:connect(toggleVisibility)
|
|
local updateSelection
|
|
updateSelection = function(text)
|
|
local foundItem = false
|
|
local children = droppedDownMenu:GetChildren()
|
|
local childNum = 1
|
|
if children then
|
|
for _, obj in ipairs(children) do
|
|
if obj.Name == "ChoiceButton" then
|
|
if obj.Text == text then
|
|
obj.Font = Enum.Font.ArialBold
|
|
foundItem = true
|
|
scrollBarPosition = childNum
|
|
else
|
|
obj.Font = Enum.Font.Arial
|
|
end
|
|
childNum = childNum + 1
|
|
end
|
|
end
|
|
end
|
|
if not text then
|
|
dropDownMenu.Text = "Choose One"
|
|
scrollBarPosition = 1
|
|
else
|
|
if not foundItem then
|
|
error("Invalid Selection Update -- " .. text)
|
|
end
|
|
if scrollBarPosition + dropDownItemCount > itemCount + 1 then
|
|
scrollBarPosition = itemCount - dropDownItemCount + 1
|
|
end
|
|
dropDownMenu.Text = text
|
|
end
|
|
end
|
|
local scrollDown
|
|
scrollDown = function()
|
|
if scrollBarPosition + dropDownItemCount <= itemCount then
|
|
scrollBarPosition = scrollBarPosition + 1
|
|
updateScroll()
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
local scrollUp
|
|
scrollUp = function()
|
|
if scrollBarPosition > 1 then
|
|
scrollBarPosition = scrollBarPosition - 1
|
|
updateScroll()
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
if useScrollButtons then
|
|
scrollUpButton = New("ImageButton", "ScrollUpButton", {
|
|
BackgroundTransparency = 1,
|
|
Image = "rbxasset://textures/ui/scrollbuttonUp.png",
|
|
Size = UDim2.new(0, 17, 0, 17),
|
|
Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0)
|
|
})
|
|
scrollUpButton.MouseButton1Click:connect(function()
|
|
scrollMouseCount = scrollMouseCount + 1
|
|
end)
|
|
scrollUpButton.MouseLeave:connect(function()
|
|
scrollMouseCount = scrollMouseCount + 1
|
|
end)
|
|
scrollUpButton.MouseButton1Down:connect(function()
|
|
scrollMouseCount = scrollMouseCount + 1
|
|
scrollUp()
|
|
local val = scrollMouseCount
|
|
wait(0.5)
|
|
while val == scrollMouseCount do
|
|
if scrollUp() == false then
|
|
break
|
|
end
|
|
wait(0.1)
|
|
end
|
|
end)
|
|
scrollUpButton.Parent = droppedDownMenu
|
|
scrollDownButton = New("ImageButton", "ScrollDownButton", {
|
|
BackgroundTransparency = 1,
|
|
Image = "rbxasset://textures/ui/scrollbuttonDown.png",
|
|
Size = UDim2.new(0, 17, 0, 17),
|
|
Position = UDim2.new(1, -11, 1, -11),
|
|
Parent = droppedDownMenu
|
|
})
|
|
scrollDownButton.MouseButton1Click:connect(function()
|
|
scrollMouseCount = scrollMouseCount + 1
|
|
end)
|
|
scrollDownButton.MouseLeave:connect(function()
|
|
scrollMouseCount = scrollMouseCount + 1
|
|
end)
|
|
scrollDownButton.MouseButton1Down:connect(function()
|
|
scrollMouseCount = scrollMouseCount + 1
|
|
scrollDown()
|
|
local val = scrollMouseCount
|
|
wait(0.5)
|
|
while val == scrollMouseCount do
|
|
if scrollDown() == false then
|
|
break
|
|
end
|
|
wait(0.1)
|
|
end
|
|
end)
|
|
local scrollbar = New("ImageLabel", "ScrollBar", {
|
|
Image = "rbxasset://textures/ui/scrollbar.png",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0, 18, (dropDownItemCount * 0.8) / ((dropDownItemCount + 1) * 0.8), -17 - 11 - 4),
|
|
Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 17 + 2),
|
|
Parent = droppedDownMenu
|
|
})
|
|
end
|
|
for _, item in ipairs(items) do
|
|
local button = choiceButton:clone()
|
|
if forRoblox then
|
|
button.RobloxLocked = true
|
|
end
|
|
button.Text = item
|
|
button.Parent = droppedDownMenu
|
|
button.MouseButton1Click:connect(function()
|
|
button.TextColor3 = Color3.new(1, 1, 1)
|
|
button.BackgroundTransparency = 1
|
|
updateSelection(item)
|
|
onSelect(item)
|
|
return toggleVisibility()
|
|
end)
|
|
button.MouseEnter:connect(function()
|
|
button.TextColor3 = Color3.new(0, 0, 0)
|
|
button.BackgroundTransparency = 0
|
|
end)
|
|
button.MouseLeave:connect(function()
|
|
button.TextColor3 = Color3.new(1, 1, 1)
|
|
button.BackgroundTransparency = 1
|
|
end)
|
|
end
|
|
updateScroll()
|
|
frame.AncestryChanged:connect(function(_, parent)
|
|
if parent == nil then
|
|
areaSoak.Parent = nil
|
|
else
|
|
areaSoak.Parent = getScreenGuiAncestor(frame)
|
|
end
|
|
end)
|
|
dropDownMenu.MouseButton1Click:connect(toggleVisibility)
|
|
areaSoak.MouseButton1Click:connect(toggleVisibility)
|
|
return frame, updateSelection
|
|
end
|
|
t.CreatePropertyDropDownMenu = function(instance, property, enum)
|
|
local items = enum:GetEnumItems()
|
|
local names = { }
|
|
local nameToItem = { }
|
|
for i, obj in ipairs(items) do
|
|
names[i] = obj.Name
|
|
nameToItem[obj.Name] = obj
|
|
end
|
|
local frame
|
|
local updateSelection
|
|
frame, updateSelection = t.CreateDropDownMenu(names, function(text)
|
|
instance[property] = nameToItem[text]
|
|
end)
|
|
ScopedConnect(frame, instance, "Changed", function(prop)
|
|
if prop == property then
|
|
return updateSelection(instance[property].Name)
|
|
end
|
|
end, function()
|
|
return updateSelection(instance[property].Name)
|
|
end)
|
|
return frame
|
|
end
|
|
t.GetFontHeight = function(font, fontSize)
|
|
if font == nil or fontSize == nil then
|
|
error("Font and FontSize must be non-nil")
|
|
end
|
|
if font == Enum.Font.Legacy then
|
|
if Enum.FontSize.Size8 == fontSize then
|
|
return 12
|
|
elseif Enum.FontSize.Size9 == fontSize then
|
|
return 14
|
|
elseif Enum.FontSize.Size10 == fontSize then
|
|
return 15
|
|
elseif Enum.FontSize.Size11 == fontSize then
|
|
return 17
|
|
elseif Enum.FontSize.Size12 == fontSize then
|
|
return 18
|
|
elseif Enum.FontSize.Size14 == fontSize then
|
|
return 21
|
|
elseif Enum.FontSize.Size18 == fontSize then
|
|
return 27
|
|
elseif Enum.FontSize.Size24 == fontSize then
|
|
return 36
|
|
elseif Enum.FontSize.Size36 == fontSize then
|
|
return 54
|
|
elseif Enum.FontSize.Size48 == fontSize then
|
|
return 72
|
|
else
|
|
return error("Unknown FontSize")
|
|
end
|
|
elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold then
|
|
if Enum.FontSize.Size8 == fontSize then
|
|
return 8
|
|
elseif Enum.FontSize.Size9 == fontSize then
|
|
return 9
|
|
elseif Enum.FontSize.Size10 == fontSize then
|
|
return 10
|
|
elseif Enum.FontSize.Size11 == fontSize then
|
|
return 11
|
|
elseif Enum.FontSize.Size12 == fontSize then
|
|
return 12
|
|
elseif Enum.FontSize.Size14 == fontSize then
|
|
return 14
|
|
elseif Enum.FontSize.Size18 == fontSize then
|
|
return 18
|
|
elseif Enum.FontSize.Size24 == fontSize then
|
|
return 24
|
|
elseif Enum.FontSize.Size36 == fontSize then
|
|
return 36
|
|
elseif Enum.FontSize.Size48 == fontSize then
|
|
return 48
|
|
else
|
|
return error("Unknown FontSize")
|
|
end
|
|
else
|
|
return error("Unknown Font " .. font)
|
|
end
|
|
end
|
|
local layoutGuiObjectsHelper
|
|
layoutGuiObjectsHelper = function(frame, guiObjects, settingsTable)
|
|
local totalPixels = frame.AbsoluteSize.Y
|
|
local pixelsRemaining = frame.AbsoluteSize.Y
|
|
for _, child in ipairs(guiObjects) do
|
|
if child:IsA("TextLabel") or child:IsA("TextButton") then
|
|
local isLabel = child:IsA("TextLabel")
|
|
if isLabel then
|
|
pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"]
|
|
else
|
|
pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"]
|
|
end
|
|
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 then
|
|
child.Visible = true
|
|
if isLabel then
|
|
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"])
|
|
end
|
|
while not child.TextFits do
|
|
child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1)
|
|
end
|
|
pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y
|
|
if isLabel then
|
|
pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"]
|
|
else
|
|
pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"]
|
|
end
|
|
else
|
|
child.Visible = false
|
|
pixelsRemaining = -1
|
|
end
|
|
else
|
|
child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining)
|
|
pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y
|
|
child.Visible = (pixelsRemaining >= 0)
|
|
end
|
|
end
|
|
end
|
|
t.LayoutGuiObjects = function(frame, guiObjects, settingsTable)
|
|
if not frame:IsA("GuiObject") then
|
|
error("Frame must be a GuiObject")
|
|
end
|
|
for _, child in ipairs(guiObjects) do
|
|
if not child:IsA("GuiObject") then
|
|
error("All elements that are layed out must be of type GuiObject")
|
|
end
|
|
end
|
|
if not settingsTable then
|
|
settingsTable = { }
|
|
end
|
|
if not settingsTable["TextLabelSizePadY"] then
|
|
settingsTable["TextLabelSizePadY"] = 0
|
|
end
|
|
if not settingsTable["TextLabelPositionPadY"] then
|
|
settingsTable["TextLabelPositionPadY"] = 0
|
|
end
|
|
if not settingsTable["TextButtonSizePadY"] then
|
|
settingsTable["TextButtonSizePadY"] = 12
|
|
end
|
|
if not settingsTable["TextButtonPositionPadY"] then
|
|
settingsTable["TextButtonPositionPadY"] = 2
|
|
end
|
|
local wrapperFrame = New("Frame", "WrapperFrame")
|
|
wrapperFrame.BackgroundTransparency = 1
|
|
wrapperFrame.Size = UDim2.new(1, 0, 1, 0)
|
|
wrapperFrame.Parent = frame
|
|
for _, child in ipairs(guiObjects) do
|
|
child.Parent = wrapperFrame
|
|
end
|
|
local recalculate
|
|
recalculate = function()
|
|
wait()
|
|
return layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable)
|
|
end
|
|
frame.Changed:connect(function(prop)
|
|
if prop == "AbsoluteSize" then
|
|
return recalculate(nil)
|
|
end
|
|
end)
|
|
frame.AncestryChanged:connect(recalculate)
|
|
return layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable)
|
|
end
|
|
t.CreateSlider = function(steps, width, position)
|
|
local sliderGui = New("Frame", "SliderGui", {
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
BackgroundTransparency = 1
|
|
})
|
|
local sliderSteps = New("IntValue", "SliderSteps", {
|
|
Value = steps,
|
|
Parent = sliderGui
|
|
})
|
|
local areaSoak = New("TextButton", "AreaSoak", {
|
|
Text = "",
|
|
BackgroundTransparency = 1,
|
|
Active = false,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Visible = false,
|
|
ZIndex = 4
|
|
})
|
|
sliderGui.AncestryChanged:connect(function(_, parent)
|
|
if parent == nil then
|
|
areaSoak.Parent = nil
|
|
else
|
|
areaSoak.Parent = getScreenGuiAncestor(sliderGui)
|
|
end
|
|
end)
|
|
local sliderPosition = New("IntValue", "SliderPosition")
|
|
sliderPosition.Value = 0
|
|
sliderPosition.Parent = sliderGui
|
|
local bar = New("TextButton", "Bar", {
|
|
Text = "",
|
|
AutoButtonColor = false,
|
|
BackgroundColor3 = Color3.new(0, 0, 0),
|
|
Size = (function()
|
|
if type(width) == "number" then
|
|
return UDim2.new(0, width, 0, 5)
|
|
else
|
|
return UDim2.new(0, 200, 0, 5)
|
|
end
|
|
end)(),
|
|
BorderColor3 = Color3.new(95 / 255, 95 / 255, 95 / 255),
|
|
ZIndex = 2,
|
|
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
|
|
end
|
|
local slider = New("ImageButton", "Slider", {
|
|
BackgroundTransparency = 1,
|
|
Image = "rbxasset://textures/ui/Slider.png",
|
|
Position = UDim2.new(0, 0, 0.5, -10),
|
|
Size = UDim2.new(0, 20, 0, 20),
|
|
ZIndex = 3,
|
|
Parent = bar
|
|
})
|
|
local areaSoakMouseMoveCon
|
|
areaSoak.MouseLeave:connect(function()
|
|
if areaSoak.Visible then
|
|
return cancelSlide(areaSoak)
|
|
end
|
|
end)
|
|
areaSoak.MouseButton1Up:connect(function()
|
|
if areaSoak.Visible then
|
|
return cancelSlide(areaSoak)
|
|
end
|
|
end)
|
|
slider.MouseButton1Down:connect(function()
|
|
areaSoak.Visible = true
|
|
if areaSoakMouseMoveCon then
|
|
areaSoakMouseMoveCon:disconnect()
|
|
end
|
|
areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x, _)
|
|
return setSliderPos(x, slider, sliderPosition, bar, steps)
|
|
end)
|
|
end)
|
|
slider.MouseButton1Up:connect(function()
|
|
return cancelSlide(areaSoak)
|
|
end)
|
|
sliderPosition.Changed:connect(function(_)
|
|
sliderPosition.Value = math.min(steps, math.max(1, sliderPosition.Value))
|
|
local relativePosX = (sliderPosition.Value - 1) / (steps - 1)
|
|
slider.Position = UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset)
|
|
end)
|
|
bar.MouseButton1Down:connect(function(x, _)
|
|
return setSliderPos(x, slider, sliderPosition, bar, steps)
|
|
end)
|
|
return sliderGui, sliderPosition, sliderSteps
|
|
end
|
|
t.CreateTrueScrollingFrame = function()
|
|
local lowY, highY
|
|
local dragCon, upCon
|
|
local internalChange = false
|
|
local descendantsChangeConMap = { }
|
|
local scrollingFrame = New("Frame", "ScrollingFrame", {
|
|
Active = true,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
ClipsDescendants = true
|
|
})
|
|
local controlFrame = New("Frame", "ControlFrame", {
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0, 18, 1, 0),
|
|
Position = UDim2.new(1, -20, 0, 0),
|
|
Parent = scrollingFrame
|
|
})
|
|
local scrollBottom = New("BoolValue", "ScrollBottom", {
|
|
Value = false,
|
|
Parent = controlFrame
|
|
})
|
|
local scrollUp = New("BoolValue", "scrollUp", {
|
|
Value = false,
|
|
Parent = controlFrame
|
|
})
|
|
local scrollUpButton = New("TextButton", "ScrollUpButton", {
|
|
Text = "",
|
|
AutoButtonColor = false,
|
|
BackgroundColor3 = Color3.new(0, 0, 0),
|
|
BorderColor3 = Color3.new(1, 1, 1),
|
|
BackgroundTransparency = 0.5,
|
|
Size = UDim2.new(0, 18, 0, 18),
|
|
ZIndex = 2,
|
|
Parent = controlFrame
|
|
})
|
|
for i = 1, 6 do
|
|
local triFrame = New("Frame", "tri" .. tostring(i), {
|
|
BorderColor3 = Color3.new(1, 1, 1),
|
|
ZIndex = 3,
|
|
BackgroundTransparency = 0.5,
|
|
Size = UDim2.new(0, 12 - ((i - 1) * 2), 0, 0),
|
|
Position = UDim2.new(0, 3 + (i - 1), 0.5, 2 - (i - 1)),
|
|
Parent = scrollUpButton
|
|
})
|
|
end
|
|
scrollUpButton.MouseEnter:connect(function()
|
|
scrollUpButton.BackgroundTransparency = 0.1
|
|
local upChildren = scrollUpButton:GetChildren()
|
|
for i = 1, #upChildren do
|
|
upChildren[i].BackgroundTransparency = 0.1
|
|
end
|
|
end)
|
|
scrollUpButton.MouseLeave:connect(function()
|
|
scrollUpButton.BackgroundTransparency = 0.5
|
|
local upChildren = scrollUpButton:GetChildren()
|
|
for i = 1, #upChildren do
|
|
upChildren[i].BackgroundTransparency = 0.5
|
|
end
|
|
end)
|
|
local scrollDownButton = scrollUpButton:clone()
|
|
scrollDownButton.Name = "ScrollDownButton"
|
|
scrollDownButton.Position = UDim2.new(0, 0, 1, -18)
|
|
local downChildren = scrollDownButton:GetChildren()
|
|
for i = 1, #downChildren do
|
|
downChildren[i].Position = UDim2.new(0, 3 + (i - 1), 0.5, -2 + (i - 1))
|
|
end
|
|
scrollDownButton.MouseEnter:connect(function()
|
|
scrollDownButton.BackgroundTransparency = 0.1
|
|
downChildren = scrollDownButton:GetChildren()
|
|
for i = 1, #downChildren do
|
|
downChildren[i].BackgroundTransparency = 0.1
|
|
end
|
|
end)
|
|
scrollDownButton.MouseLeave:connect(function()
|
|
scrollDownButton.BackgroundTransparency = 0.5
|
|
downChildren = scrollDownButton:GetChildren()
|
|
for i = 1, #downChildren do
|
|
downChildren[i].BackgroundTransparency = 0.5
|
|
end
|
|
end)
|
|
scrollDownButton.Parent = controlFrame
|
|
local scrollTrack = New("Frame", "ScrollTrack", {
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0, 18, 1, -38),
|
|
Position = UDim2.new(0, 0, 0, 19),
|
|
Parent = controlFrame
|
|
})
|
|
local scrollbar = New("TextButton", "ScrollBar", {
|
|
BackgroundColor3 = Color3.new(0, 0, 0),
|
|
BorderColor3 = Color3.new(1, 1, 1),
|
|
BackgroundTransparency = 0.5,
|
|
AutoButtonColor = false,
|
|
Text = "",
|
|
Active = true,
|
|
ZIndex = 2,
|
|
Size = UDim2.new(0, 18, 0.1, 0),
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
Parent = scrollTrack
|
|
})
|
|
local scrollNub = New("Frame", "ScrollNub", {
|
|
BorderColor3 = Color3.new(1, 1, 1),
|
|
Size = UDim2.new(0, 10, 0, 0),
|
|
Position = UDim2.new(0.5, -5, 0.5, 0),
|
|
ZIndex = 2,
|
|
BackgroundTransparency = 0.5,
|
|
Parent = scrollbar
|
|
})
|
|
local newNub = scrollNub:clone()
|
|
newNub.Position = UDim2.new(0.5, -5, 0.5, -2)
|
|
newNub.Parent = scrollbar
|
|
local lastNub = scrollNub:clone()
|
|
lastNub.Position = UDim2.new(0.5, -5, 0.5, 2)
|
|
lastNub.Parent = scrollbar
|
|
scrollbar.MouseEnter:connect(function()
|
|
scrollbar.BackgroundTransparency = 0.1
|
|
scrollNub.BackgroundTransparency = 0.1
|
|
newNub.BackgroundTransparency = 0.1
|
|
lastNub.BackgroundTransparency = 0.1
|
|
end)
|
|
scrollbar.MouseLeave:connect(function()
|
|
scrollbar.BackgroundTransparency = 0.5
|
|
scrollNub.BackgroundTransparency = 0.5
|
|
newNub.BackgroundTransparency = 0.5
|
|
lastNub.BackgroundTransparency = 0.5
|
|
end)
|
|
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 positionScrollBar
|
|
positionScrollBar = function(_, y, offset)
|
|
local oldPos = scrollbar.Position
|
|
if y < scrollTrack.AbsolutePosition.y then
|
|
scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0)
|
|
return (oldPos ~= scrollbar.Position)
|
|
end
|
|
local relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y
|
|
if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then
|
|
scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0)
|
|
return (oldPos ~= scrollbar.Position)
|
|
end
|
|
local newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset) / scrollTrack.AbsoluteSize.y
|
|
if newScaleYPos + relativeSize > 1 then
|
|
newScaleYPos = 1 - relativeSize
|
|
scrollBottom.Value = true
|
|
scrollUp.Value = false
|
|
elseif newScaleYPos <= 0 then
|
|
newScaleYPos = 0
|
|
scrollUp.Value = true
|
|
scrollBottom.Value = false
|
|
else
|
|
scrollUp.Value = false
|
|
scrollBottom.Value = false
|
|
end
|
|
scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, newScaleYPos, 0)
|
|
return (oldPos ~= scrollbar.Position)
|
|
end
|
|
local drillDownSetHighLow
|
|
drillDownSetHighLow = function(instance)
|
|
if not instance or not instance:IsA("GuiObject") then
|
|
return
|
|
end
|
|
if instance == controlFrame then
|
|
return
|
|
end
|
|
if instance:IsDescendantOf(controlFrame) then
|
|
return
|
|
end
|
|
if not instance.Visible then
|
|
return
|
|
end
|
|
if (lowY and lowY > instance.AbsolutePosition.Y) or not lowY then
|
|
lowY = instance.AbsolutePosition.Y
|
|
end
|
|
if (highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y)) or not highY then
|
|
highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y
|
|
end
|
|
local children = instance:GetChildren()
|
|
for i = 1, #children do
|
|
drillDownSetHighLow(children[i])
|
|
end
|
|
end
|
|
local resetHighLow
|
|
resetHighLow = function()
|
|
local firstChildren = scrollingFrame:GetChildren()
|
|
for i = 1, #firstChildren do
|
|
drillDownSetHighLow(firstChildren[i])
|
|
end
|
|
end
|
|
local recalculate
|
|
recalculate = function()
|
|
internalChange = true
|
|
local percentFrame = 0
|
|
if scrollbar.Position.Y.Scale > 0 then
|
|
if scrollbar.Visible then
|
|
percentFrame = scrollbar.Position.Y.Scale / ((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) / scrollTrack.AbsoluteSize.Y)
|
|
else
|
|
percentFrame = 0
|
|
end
|
|
end
|
|
if percentFrame > 0.99 then
|
|
percentFrame = 1
|
|
end
|
|
local hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame
|
|
local guiChildren = scrollingFrame:GetChildren()
|
|
for i = 1, #guiChildren do
|
|
if guiChildren[i] ~= controlFrame then
|
|
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))
|
|
end
|
|
end
|
|
lowY = nil
|
|
highY = nil
|
|
resetHighLow()
|
|
internalChange = false
|
|
end
|
|
local setSliderSizeAndPosition
|
|
setSliderSizeAndPosition = function()
|
|
if not highY or not lowY then
|
|
return
|
|
end
|
|
local totalYSpan = math.abs(highY - lowY)
|
|
if totalYSpan == 0 then
|
|
scrollbar.Visible = false
|
|
scrollDownButton.Visible = false
|
|
scrollUpButton.Visible = false
|
|
if dragCon then
|
|
dragCon:disconnect()
|
|
dragCon = nil
|
|
end
|
|
if upCon then
|
|
upCon:disconnect()
|
|
upCon = nil
|
|
end
|
|
return
|
|
end
|
|
local percentShown = scrollingFrame.AbsoluteSize.Y / totalYSpan
|
|
if percentShown >= 1 then
|
|
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)
|
|
end
|
|
local 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 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
|
|
local relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y
|
|
scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0)
|
|
end
|
|
end
|
|
local buttonScrollAmountPixels = 7
|
|
local reentrancyGuardScrollUp = false
|
|
local doScrollUp
|
|
doScrollUp = function()
|
|
if reentrancyGuardScrollUp then
|
|
return
|
|
end
|
|
reentrancyGuardScrollUp = true
|
|
if positionScrollBar(0, scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels, 0) then
|
|
recalculate()
|
|
end
|
|
reentrancyGuardScrollUp = false
|
|
end
|
|
local reentrancyGuardScrollDown = false
|
|
local doScrollDown
|
|
doScrollDown = function()
|
|
if reentrancyGuardScrollDown then
|
|
return
|
|
end
|
|
reentrancyGuardScrollDown = true
|
|
if positionScrollBar(0, scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels, 0) then
|
|
recalculate()
|
|
end
|
|
reentrancyGuardScrollDown = false
|
|
end
|
|
scrollUp = function(mouseYPos)
|
|
if scrollUpButton.Active then
|
|
local scrollStamp = tick()
|
|
local current = scrollStamp
|
|
local upCon
|
|
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 > scrollbar.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
|
|
local scrollStamp = tick()
|
|
local current = scrollStamp
|
|
local downCon
|
|
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 < (scrollbar.AbsolutePosition.y + scrollbar.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
|
|
scrollbar.MouseButton1Down:connect(function(_, y)
|
|
if scrollbar.Active then
|
|
local scrollStamp = tick()
|
|
local mouseOffset = y - scrollbar.AbsolutePosition.y
|
|
if dragCon then
|
|
dragCon:disconnect()
|
|
dragCon = nil
|
|
end
|
|
if upCon then
|
|
upCon:disconnect()
|
|
upCon = nil
|
|
end
|
|
local reentrancyGuardMouseScroll = false
|
|
dragCon = mouseDrag.MouseMoved:connect(function(x, y)
|
|
if reentrancyGuardMouseScroll then
|
|
return
|
|
end
|
|
reentrancyGuardMouseScroll = true
|
|
if positionScrollBar(x, y, mouseOffset) then
|
|
recalculate()
|
|
end
|
|
reentrancyGuardMouseScroll = false
|
|
end)
|
|
upCon = mouseDrag.MouseButton1Up:connect(function()
|
|
scrollStamp = tick()
|
|
mouseDrag.Parent = nil
|
|
dragCon:disconnect()
|
|
dragCon = nil
|
|
upCon:disconnect()
|
|
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)
|
|
local scrollTick
|
|
scrollTick = function()
|
|
scrollStamp = tick()
|
|
end
|
|
scrollUpButton.MouseButton1Up:connect(scrollTick)
|
|
scrollDownButton.MouseButton1Up:connect(scrollTick)
|
|
scrollbar.MouseButton1Up:connect(scrollTick)
|
|
local highLowRecheck
|
|
highLowRecheck = function()
|
|
local oldLowY = lowY
|
|
local oldHighY = highY
|
|
lowY = nil
|
|
highY = nil
|
|
resetHighLow()
|
|
if (lowY ~= oldLowY) or (highY ~= oldHighY) then
|
|
return setSliderSizeAndPosition()
|
|
end
|
|
end
|
|
local descendantChanged
|
|
descendantChanged = function(this, prop)
|
|
if internalChange then
|
|
return
|
|
end
|
|
if not this.Visible then
|
|
return
|
|
end
|
|
if prop == "Size" or prop == "Position" then
|
|
wait()
|
|
return highLowRecheck()
|
|
end
|
|
end
|
|
scrollingFrame.DescendantAdded:connect(function(instance)
|
|
if not instance:IsA("GuiObject") then
|
|
return
|
|
end
|
|
if instance.Visible then
|
|
wait()
|
|
highLowRecheck()
|
|
end
|
|
descendantsChangeConMap[instance] = instance.Changed:connect(function(prop)
|
|
return descendantChanged(instance, prop)
|
|
end)
|
|
end)
|
|
scrollingFrame.DescendantRemoving:connect(function(instance)
|
|
if not instance:IsA("GuiObject") then
|
|
return
|
|
end
|
|
if descendantsChangeConMap[instance] then
|
|
descendantsChangeConMap[instance]:disconnect()
|
|
descendantsChangeConMap[instance] = nil
|
|
end
|
|
wait()
|
|
return highLowRecheck()
|
|
end)
|
|
scrollingFrame.Changed:connect(function(prop)
|
|
if prop == "AbsoluteSize" then
|
|
if not highY or not lowY then
|
|
return
|
|
end
|
|
highLowRecheck()
|
|
return setSliderSizeAndPosition()
|
|
end
|
|
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)
|
|
})
|
|
local scrollStamp = 0
|
|
local scrollDrag = New("ImageButton", "ScrollDrag", {
|
|
Image = "http://www.roblox.com/asset/?id=61367186",
|
|
Size = UDim2.new(1, 0, 0, 16),
|
|
BackgroundTransparency = 1,
|
|
Active = true,
|
|
Parent = scrollbar
|
|
})
|
|
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 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
|
|
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
|
|
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()
|
|
drag = nil
|
|
end)
|
|
mouseDrag.Parent = getScreenGuiAncestor(scrollbar)
|
|
end
|
|
end)
|
|
local scrollMouseCount = 0
|
|
scrollUpButton.MouseButton1Down:connect(function()
|
|
return scrollUp()
|
|
end)
|
|
scrollUpButton.MouseButton1Up:connect(function()
|
|
scrollStamp = tick()
|
|
end)
|
|
scrollDownButton.MouseButton1Up:connect(function()
|
|
scrollStamp = tick()
|
|
end)
|
|
scrollDownButton.MouseButton1Down:connect(function()
|
|
return scrollDown()
|
|
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.Changed:connect(function(prop)
|
|
if prop == "AbsoluteSize" then
|
|
return recalculate(nil)
|
|
end
|
|
end)
|
|
frame.AncestryChanged:connect(function()
|
|
return recalculate(nil)
|
|
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 (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 (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
|
|
return nil
|
|
end
|
|
t.AutoTruncateTextObject = function(textLabel)
|
|
local text = textLabel.Text
|
|
local 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
|
|
local shortText
|
|
local mouseEnterConnection
|
|
local mouseLeaveConnection
|
|
local checkForResize
|
|
checkForResize = function()
|
|
if getGuiOwner(textLabel == nil) then
|
|
return
|
|
end
|
|
textLabel.Text = text
|
|
if textLabel.TextFits then
|
|
if mouseEnterConnection then
|
|
mouseEnterConnection:disconnect()
|
|
mouseEnterConnection = nil
|
|
end
|
|
if mouseLeaveConnection then
|
|
mouseLeaveConnection:disconnect()
|
|
mouseLeaveConnection = nil
|
|
end
|
|
else
|
|
local len = string.len(text)
|
|
textLabel.Text = text .. "~"
|
|
local textSize = binaryGrow(0, len, function(pos)
|
|
if pos == 0 then
|
|
textLabel.Text = "~"
|
|
else
|
|
textLabel.Text = string.sub(text, 1, pos) .. "~"
|
|
end
|
|
return textLabel.TextFits
|
|
end)
|
|
shortText = 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 mouseEnterConnection == nil then
|
|
mouseEnterConnection = textLabel.MouseEnter:connect(function()
|
|
fullLabel.ZIndex = textLabel.ZIndex + 1
|
|
fullLabel.Visible = true
|
|
end)
|
|
end
|
|
if 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
|
|
else
|
|
if transitionFrame.Visible == false then
|
|
transitionFrame.Size = UDim2.new(0, 50, 0, 50)
|
|
transitionFrame.Position = UDim2.new(0.5, -25, 0.5, -25)
|
|
end
|
|
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("BoolValue", "Buttons", {
|
|
Value = createButtons
|
|
})
|
|
})
|
|
local transitionFrame = 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,
|
|
Parent = frame
|
|
})
|
|
local currentPageValue = New("ObjectValue", "CurrentTutorialPage", {
|
|
Value = nil,
|
|
Parent = frame
|
|
})
|
|
local pages = New("Frame", "Pages", {
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Parent = frame
|
|
})
|
|
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" .. 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("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("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)
|
|
})
|
|
})
|
|
local skipButton = 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),
|
|
Parent = frame
|
|
})
|
|
skipButton.MouseButton1Click:connect(function()
|
|
return skipTutorial()
|
|
end)
|
|
skipButton.MouseEnter:connect(function()
|
|
skipButton.Image = "rbxasset://textures/ui/closeButton_dn.png"
|
|
end)
|
|
skipButton.MouseLeave:connect(function()
|
|
skipButton.Image = "rbxasset://textures/ui/closeButton.png"
|
|
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)
|
|
})
|
|
if skipTutorial then
|
|
doneButton.MouseButton1Click:connect(function()
|
|
return skipTutorial()
|
|
end)
|
|
end
|
|
doneButton.Parent = frame
|
|
end
|
|
local innerFrame = New("Frame", "ContentFrame", {
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0, 0, 0, 25),
|
|
Parent = frame
|
|
})
|
|
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()
|
|
parentConnection = nil
|
|
end
|
|
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 contentFrame
|
|
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
|
|
frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc)
|
|
textLabel.Parent = contentFrame
|
|
return frame
|
|
end
|
|
t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, giveDoneButton)
|
|
local frame
|
|
local 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 = UDim2.new(1, 0, y / x, 0)
|
|
imageLabel.Position = UDim2.new(0, 0, 0.5 - (y / x) / 2, 0)
|
|
else
|
|
imageLabel.Size = UDim2.new(x / y, 0, 1, 0)
|
|
imageLabel.Position = 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 showAdminCategories == nil then
|
|
showAdminCategories = false
|
|
end
|
|
local arrayPosition = 1
|
|
local insertButtons = { }
|
|
local insertButtonCons = { }
|
|
local contents
|
|
local 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
|
|
local LargeThumbnailUrl
|
|
local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower()
|
|
if useAssetVersionId then
|
|
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="
|
|
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="
|
|
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 = New("ScreenGui", "SetGui", {
|
|
New("Frame", "SetPanel", {
|
|
Active = true,
|
|
BackgroundTransparency = 1,
|
|
Position = (function()
|
|
if position then
|
|
return position
|
|
else
|
|
return UDim2.new(0.2, 29, 0.1, 24)
|
|
end
|
|
end)(),
|
|
Size = (function()
|
|
if size then
|
|
return size
|
|
else
|
|
return UDim2.new(0.6, -58, 0.64, 0)
|
|
end
|
|
end)(),
|
|
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("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
|
|
}),
|
|
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
|
|
})
|
|
})
|
|
})
|
|
})
|
|
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 = setGui.SetPanel.Sets
|
|
drillDownSetZIndex(controlFrame, 7)
|
|
return setGui
|
|
end
|
|
local createSetButton
|
|
createSetButton = function(text)
|
|
return New("TextButton", {
|
|
Text = (function()
|
|
if text then
|
|
return text
|
|
else
|
|
return ""
|
|
end
|
|
end)(),
|
|
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
|
|
})
|
|
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 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)
|
|
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 = ""
|
|
})
|
|
})
|
|
local button = 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,
|
|
Parent = insertAssetButtonExample
|
|
})
|
|
local buttonImage = New("ImageLabel", "ButtonImage", {
|
|
Image = "",
|
|
Position = UDim2.new(0, -7, 0, -7),
|
|
Size = UDim2.new(1, 14, 1, 14),
|
|
BackgroundTransparency = 1,
|
|
ZIndex = 7,
|
|
Parent = button
|
|
})
|
|
local 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
|
|
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", "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
|
|
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
|
|
if isWaterSelected then
|
|
return objectSelected(name, tonumber(assetId, nil))
|
|
else
|
|
return objectSelected(name, tonumber(assetId))
|
|
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" then
|
|
if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then
|
|
insertButtons[index]:FindFirstChild("DropDownButton", true):Destroy()
|
|
end
|
|
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
|
|
if button ~= Data.Category[Data.CurrentCategory].Button then
|
|
Data.Category[Data.CurrentCategory].Button = button
|
|
if SetCache[setId] == nil then
|
|
SetCache[setId] = game:GetService("InsertService"):GetCollection(setId)
|
|
end
|
|
Data.Category[Data.CurrentCategory].Contents = SetCache[setId]
|
|
Data.Category[Data.CurrentCategory].SetName = setName
|
|
Data.Category[Data.CurrentCategory].SetId = setId
|
|
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 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
|
|
Data.Category[Data.CurrentCategory].Button = nil
|
|
return selectSet(Data.Category[Data.CurrentCategory].ButtonFrame, Data.Category[Data.CurrentCategory].SetName, Data.Category[Data.CurrentCategory].SetId, Data.Category[Data.CurrentCategory].Index)
|
|
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
|
|
if setButtons[i]:IsA("TextButton") then
|
|
setButtons[i].Selected = false
|
|
setButtons[i].BackgroundTransparency = 1
|
|
setButtons[i].TextColor3 = Color3.new(1, 1, 1)
|
|
setButtons[i].BackgroundColor3 = Color3.new(1, 1, 1)
|
|
end
|
|
end
|
|
end
|
|
local populateSetsFrame
|
|
populateSetsFrame = function()
|
|
local currRow = 0
|
|
for i = 1, #userCategoryButtons 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
|
|
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.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)
|
|
local debounce = false
|
|
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
|
|
if newUserData[category].Name == "High Scalability" then
|
|
table.insert(userData, 1, newUserData[category])
|
|
else
|
|
table.insert(userData, newUserData[category])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if userData then
|
|
userCategoryButtons = processCategory(userData)
|
|
end
|
|
rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight)
|
|
columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth)
|
|
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)
|
|
if visible then
|
|
setGui.SetPanel.Visible = true
|
|
else
|
|
setGui.SetPanel.Visible = false
|
|
end
|
|
end
|
|
local getVisibilityFunction
|
|
getVisibilityFunction = function()
|
|
if setGui and setGui:FindFirstChild("SetPanel") then
|
|
return setGui.SetPanel.Visible
|
|
end
|
|
return false
|
|
end
|
|
return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent
|
|
end
|
|
t.CreateTerrainMaterialSelector = function(size, position)
|
|
local terrainMaterialSelectionChanged = New("BindableEvent", "TerrainMaterialSelectionChanged")
|
|
local selectedButton
|
|
local frame = New("Frame", "TerrainMaterialSelector", {
|
|
Size = (function()
|
|
if size then
|
|
return size
|
|
else
|
|
return UDim2.new(0, 245, 0, 230)
|
|
end
|
|
end)(),
|
|
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)
|
|
if "Grass" == choice then
|
|
return 1
|
|
elseif "Sand" == choice then
|
|
return 2
|
|
elseif "Erase" == choice then
|
|
return 0
|
|
elseif "Brick" == choice then
|
|
return 3
|
|
elseif "Granite" == choice then
|
|
return 4
|
|
elseif "Asphalt" == choice then
|
|
return 5
|
|
elseif "Iron" == choice then
|
|
return 6
|
|
elseif "Aluminum" == choice then
|
|
return 7
|
|
elseif "Gold" == choice then
|
|
return 8
|
|
elseif "Plank" == choice then
|
|
return 9
|
|
elseif "Log" == choice then
|
|
return 10
|
|
elseif "Gravel" == choice then
|
|
return 11
|
|
elseif "Cinder Block" == choice then
|
|
return 12
|
|
elseif "Stone Wall" == choice then
|
|
return 13
|
|
elseif "Concrete" == choice then
|
|
return 14
|
|
elseif "Plastic (red)" == choice then
|
|
return 15
|
|
elseif "Plastic (blue)" == choice then
|
|
return 16
|
|
elseif "Water" == choice then
|
|
return 17
|
|
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=" .. (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("NumberValue", "EnumType", {
|
|
Value = 0
|
|
})
|
|
})
|
|
local imageButton = New("ImageButton", tostring(name), {
|
|
AutoButtonColor = false,
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0, 30, 0, 30),
|
|
Position = UDim2.new(0, 1, 0, 1),
|
|
Parent = buttonWrap,
|
|
Image = materialToImageMap[name].Regular
|
|
})
|
|
imageButton.MouseEnter:connect(function()
|
|
buttonWrap.BackgroundTransparency = 0
|
|
end)
|
|
imageButton.MouseLeave:connect(function()
|
|
if selectedButton ~= buttonWrap then
|
|
buttonWrap.BackgroundTransparency = 1
|
|
end
|
|
end)
|
|
imageButton.MouseButton1Click:connect(function()
|
|
if selectedButton ~= buttonWrap then
|
|
return goToNewMaterial(buttonWrap, tostring(name))
|
|
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)" then
|
|
goToNewMaterial(buttons[i], matName)
|
|
return
|
|
end
|
|
if buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)" then
|
|
goToNewMaterial(buttons[i], matName)
|
|
return
|
|
end
|
|
if 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 = (function()
|
|
if size then
|
|
return size
|
|
else
|
|
return UDim2.new(0, 300, 0, 160)
|
|
end
|
|
end)(),
|
|
Position = (function()
|
|
if position then
|
|
return position
|
|
else
|
|
return UDim2.new(0.5, -150, 0.5, -80)
|
|
end
|
|
end)(),
|
|
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
|
|
})
|
|
})
|
|
local loadingBar = 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),
|
|
Parent = loadingFrame
|
|
})
|
|
local loadingGreenBar = 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,
|
|
Parent = loadingBar
|
|
})
|
|
local loadingPercent = 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),
|
|
Parent = loadingBar
|
|
})
|
|
local cancelButton = 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,
|
|
Parent = loadingFrame
|
|
})
|
|
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 " .. tostring(type(percent)) .. " instead")
|
|
end
|
|
local newSize
|
|
if percent < 0 then
|
|
newSize = UDim2.new(0, 0, 1, 0)
|
|
elseif percent > 1 then
|
|
newSize = UDim2.new(1, 0, 1, 0)
|
|
else
|
|
newSize = UDim2.new(percent, 0, 1, 0)
|
|
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
|
|
if newSize.X.Scale > 0 then
|
|
loadingGreenBar.Visible = true
|
|
return loadingGreenBar:TweenSize(newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, true)
|
|
else
|
|
return loadingGreenBar:TweenSize(newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, true, function()
|
|
if newSize.X.Scale < 0 then
|
|
loadingGreenBar.Visible = false
|
|
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 button = 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)
|
|
})
|
|
button.MouseEnter:connect(function()
|
|
if button.Selected then
|
|
return
|
|
end
|
|
button.BackgroundTransparency = 0
|
|
end)
|
|
button.MouseLeave:connect(function()
|
|
if button.Selected then
|
|
return
|
|
end
|
|
button.BackgroundTransparency = 1
|
|
end)
|
|
button.Parent = parent
|
|
return button
|
|
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
|
|
})
|
|
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
|
|
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,
|
|
Parent = dragBar
|
|
})
|
|
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 = 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,
|
|
Parent = dragBar
|
|
})
|
|
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
|
|
local minimizeFrame = 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,
|
|
Parent = dragBar
|
|
})
|
|
local minimizeBigButton = 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",
|
|
Parent = minimizeFrame
|
|
})
|
|
local separatingLine = 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),
|
|
Parent = dragBar
|
|
})
|
|
local otherSeparatingLine = separatingLine:clone()
|
|
otherSeparatingLine.Position = UDim2.new(1, -35, 0.5, -7)
|
|
otherSeparatingLine.Parent = dragBar
|
|
local widgetContainer = New("Frame", "WidgetContainer", {
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0, 0, 1, 0),
|
|
BorderColor3 = Color3.new(0, 0, 0)
|
|
})
|
|
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
|
|
if scrollable then
|
|
widgetContainer.Size = UDim2.new(0, 163, 0, 400)
|
|
else
|
|
widgetContainer.Size = UDim2.new(0, dragBar.AbsoluteSize.X, 0, 400)
|
|
end
|
|
end
|
|
if position then
|
|
widgetContainer.Position = widgetContainer.Position + UDim2.new(0, 0, 0, 20)
|
|
end
|
|
local frame, control, verticalDragger
|
|
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.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 then
|
|
control.Size = UDim2.new(0, 21, size.Y.Scale, size.Y.Offset)
|
|
else
|
|
control.Size = UDim2.new(0, 21, 0, 400)
|
|
end
|
|
control:FindFirstChild("ScrollDownButton").Position = UDim2.new(0, 0, 1, -20)
|
|
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
|
|
})
|
|
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 = "",
|
|
Parent = widgetContainer
|
|
})
|
|
local scrubFrame = 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,
|
|
Parent = verticalDragger
|
|
})
|
|
local scrubTwo = scrubFrame:clone()
|
|
scrubTwo.Position = UDim2.new(0.5, -5, 0.5, -2)
|
|
scrubTwo.Parent = verticalDragger
|
|
local scrubThree = scrubFrame:clone()
|
|
scrubThree.Position = UDim2.new(0.5, -5, 0.5, 2)
|
|
scrubThree.Parent = verticalDragger
|
|
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(function()
|
|
return switchMinimize()
|
|
end)
|
|
minimizeButton.MouseButton1Click:connect(function()
|
|
return switchMinimize()
|
|
end)
|
|
if scrollable then
|
|
return dragBar, frame, helpFrame, closeEvent
|
|
else
|
|
return dragBar, widgetContainer, helpFrame, closeEvent
|
|
end
|
|
end
|
|
t.Help = function(funcNameOrFunc)
|
|
if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu 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 funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu 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 funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog 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 funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog 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 funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight then
|
|
return "Function GetFontHeight. " .. "Arguments: (font, fontSize). " .. "Side effect: returns the size in pixels of the given font + fontSize"
|
|
elseif funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame 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 when a relayout is needed (when orderList changes)"
|
|
elseif funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame 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 funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject 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 funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider 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 funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame 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 when fired means that someone clicked the cancel button on the dialog."
|
|
elseif funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector 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
|
|
return t
|