2013/yue/45284430.yue

5187 lines
147 KiB
Plaintext

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