%CGacopXx4s4b9X1gsnJ0Ki7YqUd8AAHpI7r5RmfXXJwU+UOzJVzbMc4QyIXV5mhTlg30jihAL7vHp16ODKnHpCckg5Uuftvav9dYxQA+wSfRFFJ5pFrJL7LjOIqMHuhbp4YTnVHtO87MtXVhSwCoxXwKWuj19X4las22iucP4CY=%game:GetService("GuiService").ShowLegacyPlayerList = false local SetGui = Instance.new("ScreenGui") local SetMessageFrame = Instance.new("Frame") local SetText = Instance.new("TextLabel") SetGui.Name = "SetGui" SetGui.Parent = game.CoreGui SetMessageFrame.Name = "SetMessageFrame" SetMessageFrame.Parent = SetGui SetMessageFrame.BackgroundColor3 = Color3.new(0, 0, 0) SetMessageFrame.BackgroundTransparency = 0.5 SetMessageFrame.BorderSizePixel = 0 SetMessageFrame.Position = UDim2.new(0.25, 0, .3850000026, 0) SetMessageFrame.Size = UDim2.new(0.5, 0, 0.125, 0) SetMessageFrame.SizeConstraint = Enum.SizeConstraint.RelativeXX SetText.Name = "SetText" SetText.Parent = SetMessageFrame SetText.BackgroundTransparency = 1 SetText.Position = UDim2.new(0, 0, 0.425000012, 0) SetText.Size = UDim2.new(1, 0, 0.150000006, 0) SetText.Font = Enum.Font.ArialBold SetText.FontSize = Enum.FontSize.Size24 SetText.Text = "" SetText.TextColor3 = Color3.new(1, 1, 1) SetText.FontSize = "Size24" SetText.TextWrap = true function setMessage(text) if (text == "") then SetMessageFrame.Visible = false else SetMessageFrame.Visible = true SetText.Text = text end end setMessage("") local RBXGui = game.CoreGui.RobloxGui local Popup = Instance.new("Frame", RBXGui) local Report = Instance.new("TextButton", Popup) local Cancel = Instance.new("TextButton", Popup) local Title = Instance.new("TextLabel", Popup) local Info = Instance.new("TextLabel", Popup) local DialogFrame = Instance.new("Frame", RBXGui) RBXGui.BottomLeftControl.Position = UDim2.new(0, 0, 1, -46) RBXGui.BottomLeftControl.Size = UDim2.new(0, 130, 0, 46) RBXGui.BottomLeftControl.Image = "" RBXGui.BottomLeftControl.Exit.BackgroundTransparency = 1 RBXGui.BottomLeftControl.Exit.Position = UDim2.new(0, 2, 0, -2) RBXGui.BottomLeftControl.Exit.Size = UDim2.new(0, 56, 0, 41) RBXGui.BottomLeftControl.Exit.Image = "rbxasset://textures/Exitnew.png" RBXGui.BottomRightControl.BackgroundTransparency = 1 RBXGui.BottomRightControl.Position = UDim2.new(1, -180, 1, -41) RBXGui.BottomRightControl.Size = UDim2.new(0, 180, 0, 41) RBXGui.BottomRightControl.Image = "" RBXGui.BottomRightControl.CameraZoomIn.BackgroundTransparency = 1 RBXGui.BottomRightControl.CameraZoomIn.Position = UDim2.new(1, -29, 1, -55) RBXGui.BottomRightControl.CameraZoomIn.Size = UDim2.new(0, 25, 0, 25) RBXGui.BottomRightControl.CameraZoomIn.Image = "rbxasset://textures/CameraZoomIn.png" RBXGui.BottomRightControl.CameraZoomOut.BackgroundTransparency = 1 RBXGui.BottomRightControl.CameraZoomOut.Position = UDim2.new(1, -29, 1, -29) RBXGui.BottomRightControl.CameraZoomOut.Size = UDim2.new(0, 25, 0, 25) RBXGui.BottomRightControl.CameraZoomOut.Image = "rbxasset://textures/CameraZoomOut.png" RBXGui.BottomRightControl.CameraTiltUp.BackgroundTransparency = 1 RBXGui.BottomRightControl.CameraTiltUp.Position = UDim2.new(1, -56, 1, -55) RBXGui.BottomRightControl.CameraTiltUp.Size = UDim2.new(0, 25, 0, 25) RBXGui.BottomRightControl.CameraTiltUp.Image = "rbxasset://textures/CameraTiltUp.png" RBXGui.BottomRightControl.CameraTiltDown.BackgroundTransparency = 1 RBXGui.BottomRightControl.CameraTiltDown.Position = UDim2.new(1, -56, 1, -29) RBXGui.BottomRightControl.CameraTiltDown.Size = UDim2.new(0, 25, 0, 25) RBXGui.BottomRightControl.CameraTiltDown.Image = "rbxasset://textures/CameraTiltDown.png" RBXGui.BottomRightControl.Screenshot.BackgroundTransparency = 1 RBXGui.BottomRightControl.Screenshot.Position = UDim2.new(1, -118, 1, -40) RBXGui.BottomRightControl.Screenshot.Size = UDim2.new(0, 30, 0, 30) RBXGui.BottomRightControl.Screenshot.Image = "rbxasset://textures/Screenshot.png" RBXGui.BottomRightControl.RecordToggle.BackgroundTransparency = 1 RBXGui.BottomRightControl.RecordToggle.Position = UDim2.new(1, -150, 1, -40) RBXGui.BottomRightControl.RecordToggle.Size = UDim2.new(0, 30, 0, 30) RBXGui.BottomRightControl.RecordToggle.Image = "rbxasset://textures/RecordToggle.png" RBXGui.BottomRightControl.ToggleFullScreen.BackgroundTransparency = 1 RBXGui.BottomRightControl.ToggleFullScreen.Position = UDim2.new(1, -85, 1, -48) RBXGui.BottomRightControl.ToggleFullScreen.Size = UDim2.new(0, 24, 0, 41) RBXGui.BottomRightControl.ToggleFullScreen.Image = "rbxasset://textures/ToggleFullScreennew.png" RBXGui.BottomRightControl.ReportAbuse.Parent = nil RBXGui.BottomLeftControl.SettingsButton.Parent = nil RBXGui.BottomLeftControl.TogglePlayMode.Parent = nil RBXGui.BottomLeftControl.ToolButton.Parent = nil RBXGui.TopLeftControl.Parent = nil DialogFrame.Name = "DialogFrame" DialogFrame.Size = UDim2.new(0.2, 0, 0.06, 0) DialogFrame.Position = UDim2.new(0, 0, 0.94, 0) DialogFrame.BackgroundTransparency = 1 Popup.Name = "Popup" Popup.Position = UDim2.new(0.5, -165, 0.5, -125) Popup.Size = UDim2.new(0, 330, 0, 250) Popup.ZIndex = 4 Popup.Style = Enum.FrameStyle.RobloxRound Popup.Visible = false Report.Name = "Report" Report.Position = UDim2.new(0, 20, 0, 170) Report.Size = UDim2.new(0, 100, 0, 50) Report.ZIndex = 5 Report.Style = Enum.ButtonStyle.RobloxButton Report.Font = Enum.Font.ArialBold Report.FontSize = Enum.FontSize.Size24 Report.Text = "Report" Report.TextColor3 = Color3.new(0.972549, 0.972549, 0.972549) Cancel.Name = "Cancel" Cancel.Position = UDim2.new(1, -120, 0, 170) Cancel.Size = UDim2.new(0, 100, 0, 50) Cancel.ZIndex = 5 Cancel.Style = Enum.ButtonStyle.RobloxButton Cancel.Font = Enum.Font.ArialBold Cancel.FontSize = Enum.FontSize.Size24 Cancel.Text = "Cancel" Cancel.TextColor3 = Color3.new(0.972549, 0.972549, 0.972549) Title.Name = "Title" Title.BackgroundTransparency = 1 Title.Position = UDim2.new(0, 0, -0.0299999993, 0) Title.Size = UDim2.new(1, 0, 0.5, 0) Title.ZIndex = 5 Title.Font = Enum.Font.ArialBold Title.FontSize = Enum.FontSize.Size36 Title.Text = "Report" Title.TextColor3 = Color3.new(0.972549, 0.972549, 0.972549) Title.TextWrap = true Info.Name = "Info" Info.BackgroundTransparency = 1 Info.Position = UDim2.new(0, 0, 0.219999999, 0) Info.Size = UDim2.new(1, 0, 0.5, 0) Info.ZIndex = 5 Info.Font = Enum.Font.Arial Info.FontSize = Enum.FontSize.Size18 Info.Text = "Info" Info.TextColor3 = Color3.new(0.972549, 0.972549, 0.972549) Info.TextWrap = true Cancel.MouseButton1Click:connect(function() Popup.Visible = not Popup.Visible end) RBXGui.BottomRightControl.ToggleFullScreen.MouseLeave:connect(function() RBXGui.BottomRightControl.ToggleFullScreen.Active = true RBXGui.BottomRightControl.ToggleFullScreen.Image = "rbxasset://textures/ToggleFullScreennew.png" end) RBXGui.BottomRightControl.ToggleFullScreen.MouseEnter:connect(function() RBXGui.BottomRightControl.ToggleFullScreen.Image = "rbxasset://textures/ToggleFullScreen_dn.png" RBXGui.BottomRightControl.ToggleFullScreen.Active = true end) RBXGui.BottomLeftControl.Exit.MouseLeave:connect(function() RBXGui.BottomLeftControl.Exit.Image = "rbxasset://textures/Exitnew.png" end) RBXGui.BottomLeftControl.Exit.MouseEnter:connect(function() RBXGui.BottomLeftControl.Exit.Image = "rbxasset://textures/Exit_dn.png" end) game:GetService("GuiService").Changed:connect(function() game:GetService("GuiService").ShowLegacyPlayerList = false game.CoreGui.RobloxGui.PlayerListScript.Parent = nil game.CoreGui.RobloxGui.PlayerListTopRightFrame.Parent = nil game.CoreGui.RobloxGui.BigPlayerListWindowImposter.Parent = nil game.CoreGui.RobloxGui.BigPlayerlist.Parent = nil end) coroutine.resume(coroutine.create(function() function waitForProperty(instance, name) while not instance[name] do instance.Changed:wait() end end function waitForChild(instance, name) while not instance:FindFirstChild(name) do instance.ChildAdded:wait() end end local mainFrame local choices = {} local lastChoice local choiceMap = {} local currentConversationDialog local currentConversationPartner local currentAbortDialogScript local KillDialogs = {} local tooFarAwayMessage = "You are too far away to chat!" local tooFarAwaySize = 300 local characterWanderedOffMessage = "Chat ended because you walked away" local characterWanderedOffSize = 350 local conversationTimedOut = "Chat ended because you did not reply" local conversationTimedOutSize = 350 local player local screenGui local chatNotificationGui local messageDialog local reenableDialogScript local dialogMap = {} local dialogConnections = {} local gui = game.CoreGui.RobloxGui function currentTone() if currentConversationDialog then return currentConversationDialog.Tone else return Enum.DialogTone.Neutral end end function createChatNotificationGui() chatNotificationGui = Instance.new("BillboardGui") chatNotificationGui.Name = "ChatNotificationGui" chatNotificationGui.ExtentsOffset = Vector3.new(0,1,0) chatNotificationGui.Size = UDim2.new(4, 0, 5.42857122, 0) chatNotificationGui.SizeOffset = Vector2.new(0,0) chatNotificationGui.StudsOffset = Vector3.new(0.4, 4.3, 0) chatNotificationGui.Enabled = true chatNotificationGui.Active = true local image = Instance.new("ImageLabel") image.Name = "Image" image.Active = false image.BackgroundTransparency = 1 image.Position = UDim2.new(0,0,0,0) image.Size = UDim2.new(1.0,0,1.0,0) image.Image = "" image.Parent = chatNotificationGui local button = Instance.new("ImageButton") button.Name = "Button" button.AutoButtonColor = false button.Position = UDim2.new(0.0879999995, 0, 0.0529999994, 0) button.Size = UDim2.new(0.829999983, 0, 0.460000008, 0) button.Image = "" button.BackgroundTransparency = 1 button.Parent = image end function getChatColor(tone) if tone == Enum.DialogTone.Neutral then return Enum.ChatColor.Blue elseif tone == Enum.DialogTone.Friendly then return Enum.ChatColor.Green elseif tone == Enum.DialogTone.Enemy then return Enum.ChatColor.Red end end function styleChoices(tone) for i, obj in pairs(choices) do resetColor(obj, tone) end resetColor(lastChoice, tone) end function styleMainFrame(tone) if tone == Enum.DialogTone.Neutral then mainFrame.Style = Enum.FrameStyle.ChatBlue mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" elseif tone == Enum.DialogTone.Friendly then mainFrame.Style = Enum.FrameStyle.ChatGreen mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botGreen_tailRight.png" elseif tone == Enum.DialogTone.Enemy then mainFrame.Style = Enum.FrameStyle.ChatRed mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botRed_tailRight.png" end styleChoices(tone) end function setChatNotificationTone(gui, purpose, tone) if tone == Enum.DialogTone.Neutral then gui.Image.Image = "rbxasset://textures/chatBubble_botBlue_notify_bkg.png" elseif tone == Enum.DialogTone.Friendly then gui.Image.Image = "rbxasset://textures/chatBubble_botGreen_notify_bkg.png" elseif tone == Enum.DialogTone.Enemy then gui.Image.Image = "rbxasset://textures/chatBubble_botRed_notify_bkg.png" end if purpose == Enum.DialogPurpose.Quest then gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_bang.png" elseif purpose == Enum.DialogPurpose.Help then gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_question.png" elseif purpose == Enum.DialogPurpose.Shop then gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_money.png" end end function createMessageDialog() messageDialog = Instance.new("Frame"); messageDialog.Name = "DialogScriptMessage" messageDialog.Style = Enum.FrameStyle.RobloxRound messageDialog.Visible = false local text = Instance.new("TextLabel") text.Name = "Text" text.Position = UDim2.new(0,0,0,-1) text.Size = UDim2.new(1,0,1,0) text.FontSize = Enum.FontSize.Size14 text.BackgroundTransparency = 1 text.TextColor3 = Color3.new(1,1,1) text.Parent = messageDialog end function showMessage(msg, size) messageDialog.Text.Text = msg messageDialog.Size = UDim2.new(0,size,0,40) messageDialog.Position = UDim2.new(0.5, -size/2, 0.5, -40) messageDialog.Visible = true wait(2) messageDialog.Visible = false end function variableDelay(str) local length = math.min(string.len(str), 100) wait(0.75 + ((length/75) * 1.5)) end function resetColor(frame, tone) if tone == Enum.DialogTone.Neutral then frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255) frame.Number.TextColor3 = Color3.new(45/255, 142/255, 245/255) elseif tone == Enum.DialogTone.Friendly then frame.BackgroundColor3 = Color3.new(0/255, 77/255, 0/255) frame.Number.TextColor3 = Color3.new(0/255, 190/255, 0/255) elseif tone == Enum.DialogTone.Enemy then frame.BackgroundColor3 = Color3.new(140/255, 0/255, 0/255) frame.Number.TextColor3 = Color3.new(255/255,88/255, 79/255) end end function highlightColor(frame, tone) if tone == Enum.DialogTone.Neutral then frame.BackgroundColor3 = Color3.new(2/255, 108/255, 255/255) frame.Number.TextColor3 = Color3.new(1, 1, 1) elseif tone == Enum.DialogTone.Friendly then frame.BackgroundColor3 = Color3.new(0/255, 128/255, 0/255) frame.Number.TextColor3 = Color3.new(1, 1, 1) elseif tone == Enum.DialogTone.Enemy then frame.BackgroundColor3 = Color3.new(204/255, 0/255, 0/255) frame.Number.TextColor3 = Color3.new(1, 1, 1) end end function wanderDialog() mainFrame.Visible = false endDialog() showMessage(characterWanderedOffMessage, characterWanderedOffSize) end function timeoutDialog() mainFrame.Visible = false endDialog() showMessage(conversationTimedOut, conversationTimedOutSize) end function normalEndDialog() endDialog() end function endDialog() if currentAbortDialogScript then currentAbortDialogScript:Remove() currentAbortDialogScript = nil end local dialog = currentConversationDialog currentConversationDialog = nil if dialog and dialog.InUse then end for dialog, gui in pairs(dialogMap) do if dialog and gui then gui.Enabled = not dialog.InUse end end currentConversationPartner = nil end function sanitizeMessage(msg) if string.len(msg) == 0 then return "..." else return msg end end function selectChoice(choice) renewKillswitch(currentConversationDialog) mainFrame.Visible = false if choice == lastChoice then game.Chat:Chat(game.Players.LocalPlayer.Character, "Goodbye!", getChatColor(currentTone())) normalEndDialog() else local dialogChoice = choiceMap[choice] game.Chat:Chat(game.Players.LocalPlayer.Character, sanitizeMessage(dialogChoice.UserDialog), getChatColor(currentTone())) wait(1) coroutine.resume(coroutine.create(function() currentConversationDialog:SignalDialogChoiceSelected(player, dialogChoice) end)) game.Chat:Chat(currentConversationPartner, sanitizeMessage(dialogChoice.ResponseDialog), getChatColor(currentTone())) variableDelay(dialogChoice.ResponseDialog) presentDialogChoices(currentConversationPartner, dialogChoice:GetChildren()) end end function newChoice(numberText) local frame = Instance.new("TextButton") frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255) frame.AutoButtonColor = false frame.BorderSizePixel = 0 frame.Text = "" frame.MouseEnter:connect(function() highlightColor(frame, currentTone()) end) frame.MouseLeave:connect(function() resetColor(frame, currentTone()) end) frame.MouseButton1Click:connect(function() selectChoice(frame) end) local number = Instance.new("TextLabel") number.Name = "Number" number.TextColor3 = Color3.new(127/255, 212/255, 255/255) number.Text = numberText number.FontSize = Enum.FontSize.Size14 number.BackgroundTransparency = 1 number.Position = UDim2.new(0,4,0,2) number.Size = UDim2.new(0,20,0,24) number.TextXAlignment = Enum.TextXAlignment.Left number.TextYAlignment = Enum.TextYAlignment.Top number.Parent = frame local prompt = Instance.new("TextLabel") prompt.Name = "UserPrompt" prompt.BackgroundTransparency = 1 prompt.TextColor3 = Color3.new(1,1,1) prompt.FontSize = Enum.FontSize.Size14 prompt.Position = UDim2.new(0,28, 0, 2) prompt.Size = UDim2.new(1,-32, 1, -4) prompt.TextXAlignment = Enum.TextXAlignment.Left prompt.TextYAlignment = Enum.TextYAlignment.Top prompt.TextWrap = true prompt.Parent = frame return frame end function initialize(parent) choices[1] = newChoice("1)") choices[2] = newChoice("2)") choices[3] = newChoice("3)") choices[4] = newChoice("4)") lastChoice = newChoice("5)") lastChoice.UserPrompt.Text = "Goodbye!" lastChoice.Size = UDim2.new(1,0,0,28) mainFrame = Instance.new("Frame") mainFrame.Name = "UserDialogArea" mainFrame.Size = UDim2.new(0, 350, 0, 200) mainFrame.Style = Enum.FrameStyle.ChatBlue mainFrame.Visible = false imageLabel = Instance.new("ImageLabel") imageLabel.Name = "Tail" imageLabel.Size = UDim2.new(0,62,0,53) imageLabel.Position = UDim2.new(1,8,0.25) imageLabel.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" imageLabel.BackgroundTransparency = 1 imageLabel.Parent = mainFrame for n, obj in pairs(choices) do obj.Parent = mainFrame end lastChoice.Parent = mainFrame mainFrame.Parent = parent end function presentDialogChoices(talkingPart, dialogChoices) if not currentConversationDialog then return end currentConversationPartner = talkingPart local sortedDialogChoices = {} for n, obj in pairs(dialogChoices) do if obj:IsA("DialogChoice") then table.insert(sortedDialogChoices, obj) end end table.sort(sortedDialogChoices, function(a,b) return a.Name < b.Name end) if #sortedDialogChoices == 0 then normalEndDialog() return end local pos = 1 local yPosition = 0 choiceMap = {} for n, obj in pairs(choices) do obj.Visible = false end for n, obj in pairs(sortedDialogChoices) do if pos <= #choices then choices[pos].Size = UDim2.new(1, 0, 0, 24*3) choices[pos].UserPrompt.Text = obj.UserDialog local height = math.ceil(choices[pos].UserPrompt.TextBounds.Y/24)*24 choices[pos].Position = UDim2.new(0, 0, 0, yPosition) choices[pos].Size = UDim2.new(1, 0, 0, height) choices[pos].Visible = true choiceMap[choices[pos]] = obj yPosition = yPosition + height pos = pos + 1 end end lastChoice.Position = UDim2.new(0,0,0,yPosition) lastChoice.Number.Text = pos .. ")" mainFrame.Size = UDim2.new(0, 350, 0, yPosition+24+32) mainFrame.Position = UDim2.new(0,20,0.0, -mainFrame.Size.Y.Offset-20) styleMainFrame(currentTone()) mainFrame.Visible = true end function doDialog(dialog) coroutine.resume(coroutine.create(function() dialog.InUse = true currentConversationDialog = dialog game.Chat:Chat(dialog.Parent, dialog.InitialPrompt, getChatColor(dialog.Tone)) variableDelay(dialog.InitialPrompt) presentDialogChoices(dialog.Parent, dialog:GetChildren()) end)) end function renewKillswitch(dialog) if KillDialogs[dialog] == nil then KillDialogs[dialog] = 0 end KillDialogs[dialog] = KillDialogs[dialog] + 1 local CurrentDialogNumber = KillDialogs[dialog] coroutine.resume(coroutine.create(function() wait(15) if KillDialogs[dialog] == CurrentDialogNumber then if dialog:IsA("Dialog") then dialog.InUse = false end end end)) end function checkForLeaveArea() while currentConversationDialog do if currentConversationDialog.Parent and (player:DistanceFromCharacter(currentConversationDialog.Parent.Position) >= currentConversationDialog.ConversationDistance) then wanderDialog() end wait(1) end end function startDialog(dialog) if dialog.Parent and dialog.Parent:IsA("BasePart") then if player:DistanceFromCharacter(dialog.Parent.Position) >= dialog.ConversationDistance then showMessage(tooFarAwayMessage, tooFarAwaySize) return end for dialog, gui in pairs(dialogMap) do if dialog and gui then gui.Enabled = false end end renewKillswitch(dialog) delay(1, checkForLeaveArea) doDialog(dialog) end end function removeDialog(dialog) if dialogMap[dialog] then dialogMap[dialog]:Remove() dialogMap[dialog] = nil end if dialogConnections[dialog] then dialogConnections[dialog]:disconnect() dialogConnections[dialog] = nil end end function addDialog(dialog) if dialog.Parent and dialog.Parent:IsA("BasePart") then local chatGui = chatNotificationGui:clone() chatGui.Enabled = not dialog.InUse chatGui.Adornee = dialog.Parent chatGui.Parent = game.CoreGui chatGui.Image.Button.MouseButton1Click:connect(function() startDialog(dialog) end) setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) dialogMap[dialog] = chatGui dialogConnections[dialog] = dialog.Changed:connect(function(prop) if prop == "Parent" and dialog.Parent then removeDialog(dialog) addDialog(dialog) elseif prop == "InUse" then chatGui.Enabled = not currentConversationDialog and not dialog.InUse if dialog == currentConversationDialog then timeoutDialog() end elseif prop == "Tone" or prop == "Purpose" then setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) end end) end end function fetchScripts() end function onLoad() waitForProperty(game.Players, "LocalPlayer") player = game.Players.LocalPlayer waitForProperty(player, "Character") fetchScripts() createChatNotificationGui() createMessageDialog() messageDialog.Parent = gui local frame = Instance.new("Frame") frame.Name = "DialogFrame" frame.Position = UDim2.new(0,0,0,0) frame.Size = UDim2.new(0,0,0,0) frame.BackgroundTransparency = 1 frame.Parent = gui.DialogFrame initialize(frame) game.CollectionService.ItemAdded:connect(function(obj) if obj:IsA("Dialog") then addDialog(obj) end end) game.CollectionService.ItemRemoved:connect(function(obj) if obj:IsA("Dialog") then removeDialog(obj) end end) for i, obj in pairs(game.CollectionService:GetCollection("Dialog")) do if obj:IsA("Dialog") then addDialog(obj) end end end onLoad() end)) pcall(function() game:GetService("Players"):SetChatStyle(Enum.ChatStyle.ClassicAndBubble) end) local tags = { ["energycell"] = "http://xdiscuss.net/html/img/badges/2.png" } coroutine.resume(coroutine.create(function() game.CoreGui.PlayerListGUI.Parent = nil end)) coroutine.resume(coroutine.create(function() for _,v in pairs(game:GetChildren()) do if v.Name == "GuiRoot" then coroutine.resume(coroutine.create(function() v.ScoreHud.Parent = nil end)) end end end)) local PlayerlistScreenGui = Instance.new("ScreenGui",game.CoreGui) PlayerlistScreenGui.Name = "PlayerListGUI" local t = {} local function ScopedConnect(parentInstance, instance, event, signalFunc, syncFunc, removeFunc) local eventConnection = nil local tryConnect = function() if game:IsAncestorOf(parentInstance) then if not eventConnection then eventConnection = instance[event]:connect(signalFunc) if syncFunc then syncFunc() end end else if eventConnection then eventConnection:disconnect() if removeFunc then removeFunc() end end end end local connection = parentInstance.AncestryChanged:connect(tryConnect) tryConnect() return connection end local function CreateButtons(frame, buttons, yPos, ySize) local buttonNum = 1 local buttonObjs = {} for i, obj in ipairs(buttons) do local button = Instance.new("TextButton") button.Name = "Button" .. buttonNum button.Font = Enum.Font.Arial button.FontSize = Enum.FontSize.Size18 button.AutoButtonColor = true button.Style = Enum.ButtonStyle.RobloxButtonDefault button.Text = obj.Text button.TextColor3 = Color3.new(1,1,1) button.MouseButton1Click:connect(obj.Function) button.Parent = frame buttonObjs[buttonNum] = button buttonNum = buttonNum + 1 end local numButtons = buttonNum-1 if numButtons == 1 then frame.Button1.Position = UDim2.new(0.35, 0, yPos.Scale, yPos.Offset) frame.Button1.Size = UDim2.new(.4,0,ySize.Scale, ySize.Offset) elseif numButtons == 2 then frame.Button1.Position = UDim2.new(0.1, 0, yPos.Scale, yPos.Offset) frame.Button1.Size = UDim2.new(.8/3,0, ySize.Scale, ySize.Offset) frame.Button2.Position = UDim2.new(0.55, 0, yPos.Scale, yPos.Offset) frame.Button2.Size = UDim2.new(.35,0, ySize.Scale, ySize.Offset) elseif numButtons >= 3 then local spacing = .1 / numButtons local buttonSize = .9 / numButtons buttonNum = 1 while buttonNum <= numButtons do buttonObjs[buttonNum].Position = UDim2.new(spacing*buttonNum + (buttonNum-1) * buttonSize, 0, yPos.Scale, yPos.Offset) buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) buttonNum = buttonNum + 1 end end end local function setSliderPos(newAbsPosX,slider,sliderPosition,bar,steps) local newStep = steps - 1 local relativePosX = math.min(1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X ) ) local wholeNum, remainder = math.modf(relativePosX * newStep) if remainder > 0.5 then wholeNum = wholeNum + 1 end relativePosX = wholeNum/newStep local result = math.ceil(relativePosX * newStep) if sliderPosition.Value ~= (result + 1) then sliderPosition.Value = result + 1 if relativePosX == 1 then slider.Position = UDim2.new(1,-slider.AbsoluteSize.X,slider.Position.Y.Scale,slider.Position.Y.Offset) else slider.Position = UDim2.new(relativePosX,0,slider.Position.Y.Scale,slider.Position.Y.Offset) end end end local function cancelSlide(areaSoak) areaSoak.Visible = false if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end end t.CreateStyledMessageDialog = function(title, message, style, buttons) local 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 local styleImage = Instance.new("ImageLabel") styleImage.Name = "StyleImage" styleImage.BackgroundTransparency = 1 styleImage.Position = UDim2.new(0,5,0,15) if style == "error" or style == "Error" then styleImage.Size = UDim2.new(0, 71, 0, 71) styleImage.Image = "http://www.roblox.com/asset?id=42565285" elseif style == "notify" or style == "Notify" then styleImage.Size = UDim2.new(0, 71, 0, 71) styleImage.Image = "http://www.roblox.com/asset?id=42604978" elseif style == "confirm" or style == "Confirm" then styleImage.Size = UDim2.new(0, 74, 0, 76) styleImage.Image = "http://www.roblox.com/asset?id=42557901" else return t.CreateMessageDialog(title,message,buttons) end styleImage.Parent = frame local titleLabel = 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, 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 local 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, 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) local 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 local 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 local 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, .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) local width = UDim.new(0, 100) local height = UDim.new(0, 32) local xPos = 0.055 local frame = Instance.new("Frame") frame.Name = "DropDownMenu" frame.BackgroundTransparency = 1 frame.Size = UDim2.new(width, height) local 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 local 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 local itemCount = #items local dropDownItemCount = #items local useScrollButtons = false if dropDownItemCount > 6 then useScrollButtons = true dropDownItemCount = 6 end local droppedDownMenu = Instance.new("TextButton") droppedDownMenu.Name = "List" droppedDownMenu.Text = "" droppedDownMenu.BackgroundTransparency = 1 droppedDownMenu.Style = Enum.ButtonStyle.RobloxButton droppedDownMenu.Visible = false droppedDownMenu.Active = true droppedDownMenu.Position = UDim2.new(0,0,0,0) droppedDownMenu.Size = UDim2.new(1,0, (1 + dropDownItemCount)*.8, 0) droppedDownMenu.Parent = frame droppedDownMenu.ZIndex = 2 local 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 then choiceButton.Size = UDim2.new(1,-13, .8/((dropDownItemCount + 1)*.8),0) else choiceButton.Size = UDim2.new(1, 0, .8/((dropDownItemCount + 1)*.8),0) end choiceButton.TextWrap = true choiceButton.ZIndex = 2 local dropDownSelected = false local scrollUpButton local scrollDownButton local scrollMouseCount = 0 local setZIndex = function(baseZIndex) droppedDownMenu.ZIndex = baseZIndex +1 if scrollUpButton then scrollUpButton.ZIndex = baseZIndex + 3 end if scrollDownButton then scrollDownButton.ZIndex = baseZIndex + 3 end local children = droppedDownMenu:GetChildren() if children then for i, child in ipairs(children) do if child.Name == "ChoiceButton" then child.ZIndex = baseZIndex + 2 elseif child.Name == "ClickCaptureButton" then child.ZIndex = baseZIndex end end end end local scrollBarPosition = 1 local updateScroll = function() if scrollUpButton then scrollUpButton.Active = scrollBarPosition > 1 end if scrollDownButton then scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount end local children = droppedDownMenu:GetChildren() if not children then return end local childNum = 1 for i, obj in ipairs(children) do if obj.Name == "ChoiceButton" then if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount then obj.Visible = false else obj.Position = UDim2.new(0,0,((childNum-scrollBarPosition+1)*.8)/((dropDownItemCount+1)*.8),0) obj.Visible = true end obj.TextColor3 = Color3.new(1,1,1) obj.BackgroundTransparency = 1 childNum = childNum + 1 end end end local toggleVisibility = function() dropDownSelected = not dropDownSelected dropDownMenu.Visible = not dropDownSelected droppedDownMenu.Visible = dropDownSelected if dropDownSelected then setZIndex(4) else setZIndex(2) end if useScrollButtons then updateScroll() end end droppedDownMenu.MouseButton1Click:connect(toggleVisibility) local updateSelection = function(text) local foundItem = false local children = droppedDownMenu:GetChildren() local childNum = 1 if children then for i, obj in ipairs(children) do if obj.Name == "ChoiceButton" then if obj.Text == text then obj.Font = Enum.Font.ArialBold foundItem = true scrollBarPosition = childNum else obj.Font = Enum.Font.Arial end childNum = childNum + 1 end end end if not text then dropDownMenu.Text = "Choose One" scrollBarPosition = 1 else if not foundItem then error("Invalid Selection Update -- " .. text) end if scrollBarPosition + dropDownItemCount > itemCount + 1 then scrollBarPosition = itemCount - dropDownItemCount + 1 end dropDownMenu.Text = text end end local function scrollDown() if scrollBarPosition + dropDownItemCount <= itemCount then scrollBarPosition = scrollBarPosition + 1 updateScroll() return true end return false end local function scrollUp() if scrollBarPosition > 1 then scrollBarPosition = scrollBarPosition - 1 updateScroll() return true end return false end if useScrollButtons then 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*.8)/((dropDownItemCount+1)*.8),0) scrollUpButton.MouseButton1Click:connect( function() scrollMouseCount = scrollMouseCount + 1 end) scrollUpButton.MouseLeave:connect( function() scrollMouseCount = scrollMouseCount + 1 end) scrollUpButton.MouseButton1Down:connect( function() scrollMouseCount = scrollMouseCount + 1 scrollUp() local val = scrollMouseCount wait(0.5) while val == scrollMouseCount do if scrollUp() == false then break end wait(0.1) end end) scrollUpButton.Parent = droppedDownMenu scrollDownButton = 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( function() scrollMouseCount = scrollMouseCount + 1 end) scrollDownButton.MouseLeave:connect( function() scrollMouseCount = scrollMouseCount + 1 end) scrollDownButton.MouseButton1Down:connect( function() scrollMouseCount = scrollMouseCount + 1 scrollDown() local val = scrollMouseCount wait(0.5) while val == scrollMouseCount do if scrollDown() == false then break end wait(0.1) end end) local scrollbar = Instance.new("ImageLabel") scrollbar.Name = "ScrollBar" scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" scrollbar.BackgroundTransparency = 1 scrollbar.Size = UDim2.new(0, 18, (dropDownItemCount*.8)/((dropDownItemCount+1)*.8), -(17) - 11 - 4) scrollbar.Position = UDim2.new(1,-11,(1*.8)/((dropDownItemCount+1)*.8),17+2) scrollbar.Parent = droppedDownMenu end for i,item in ipairs(items) do local button = choiceButton:clone() if forRoblox then end button.Text = item button.Parent = droppedDownMenu button.MouseButton1Click:connect(function() button.TextColor3 = Color3.new(1,1,1) button.BackgroundTransparency = 1 updateSelection(item) onSelect(item) toggleVisibility() end) button.Visible = false button.MouseEnter:connect(function() button.TextColor3 = Color3.new(0,0,0) button.BackgroundTransparency = 0 button.Visible = false end) button.MouseLeave:connect(function() button.TextColor3 = Color3.new(1,1,1) button.BackgroundTransparency = 1 button.Visible = false end) end updateScroll() local bigFakeButton = Instance.new("TextButton") bigFakeButton.BackgroundTransparency = 1 bigFakeButton.Name = "ClickCaptureButton" bigFakeButton.Size = UDim2.new(0, 4000, 0, 3000) bigFakeButton.Position = UDim2.new(0, -2000, 0, -1500) bigFakeButton.ZIndex = 1 bigFakeButton.Text = "" bigFakeButton.Parent = droppedDownMenu bigFakeButton.MouseButton1Click:connect(toggleVisibility) dropDownMenu.MouseButton1Click:connect(toggleVisibility) return frame, updateSelection end t.CreatePropertyDropDownMenu = function(instance, property, enum) local items = enum:GetEnumItems() local names = {} local nameToItem = {} for i,obj in ipairs(items) do names[i] = obj.Name nameToItem[obj.Name] = obj end local frame local updateSelection frame, updateSelection = t.CreateDropDownMenu(names, function(text) instance[property] = nameToItem[text] end) ScopedConnect(frame, instance, "Changed", function(prop) if prop == property then updateSelection(instance[property].Name) end end, function() updateSelection(instance[property].Name) end) return frame end t.GetFontHeight = function(font, fontSize) if font == nil or fontSize == nil then error("Font and FontSize must be non-nil") end if font == Enum.Font.Legacy then if fontSize == Enum.FontSize.Size8 then return 12 elseif fontSize == Enum.FontSize.Size9 then return 14 elseif fontSize == Enum.FontSize.Size10 then return 15 elseif fontSize == Enum.FontSize.Size11 then return 17 elseif fontSize == Enum.FontSize.Size12 then return 18 elseif fontSize == Enum.FontSize.Size14 then return 21 elseif fontSize == Enum.FontSize.Size18 then return 27 elseif fontSize == Enum.FontSize.Size24 then return 36 elseif fontSize == Enum.FontSize.Size36 then return 54 elseif fontSize == Enum.FontSize.Size48 then return 72 else error("Unknown FontSize") end elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold then if fontSize == Enum.FontSize.Size8 then return 8 elseif fontSize == Enum.FontSize.Size9 then return 9 elseif fontSize == Enum.FontSize.Size10 then return 10 elseif fontSize == Enum.FontSize.Size11 then return 11 elseif fontSize == Enum.FontSize.Size12 then return 12 elseif fontSize == Enum.FontSize.Size14 then return 14 elseif fontSize == Enum.FontSize.Size18 then return 18 elseif fontSize == Enum.FontSize.Size24 then return 24 elseif fontSize == Enum.FontSize.Size36 then return 36 elseif fontSize == Enum.FontSize.Size48 then return 48 else error("Unknown FontSize") end else error("Unknown Font " .. font) end end local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) local totalPixels = frame.AbsoluteSize.Y local pixelsRemaining = frame.AbsoluteSize.Y for i, child in ipairs(guiObjects) do if child:IsA("TextLabel") or child:IsA("TextButton") then local isLabel = child:IsA("TextLabel") if isLabel then pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] else pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] end child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining) if child.TextFits and child.TextBounds.Y < pixelsRemaining then child.Visible = true if isLabel then child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.TextBounds.Y + settingsTable["TextLabelSizePadY"]) else child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.TextBounds.Y + settingsTable["TextButtonSizePadY"]) end while not child.TextFits do child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1) end pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y if isLabel then pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] else pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] end else child.Visible = false pixelsRemaining = -1 end else child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y child.Visible = (pixelsRemaining >= 0) end end end t.LayoutGuiObjects = function(frame, guiObjects, settingsTable) if not frame:IsA("GuiObject") then error("Frame must be a GuiObject") end for i, child in ipairs(guiObjects) do if not child:IsA("GuiObject") then error("All elements that are layed out must be of type GuiObject") end end if not settingsTable then settingsTable = {} end if not settingsTable["TextLabelSizePadY"] then settingsTable["TextLabelSizePadY"] = 0 end if not settingsTable["TextLabelPositionPadY"] then settingsTable["TextLabelPositionPadY"] = 0 end if not settingsTable["TextButtonSizePadY"] then settingsTable["TextButtonSizePadY"] = 12 end if not settingsTable["TextButtonPositionPadY"] then settingsTable["TextButtonPositionPadY"] = 2 end local wrapperFrame = Instance.new("Frame") wrapperFrame.Name = "WrapperFrame" wrapperFrame.BackgroundTransparency = 1 wrapperFrame.Size = UDim2.new(1,0,1,0) wrapperFrame.Parent = frame for i, child in ipairs(guiObjects) do child.Parent = wrapperFrame end local recalculate = function() wait() layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) end frame.Changed:connect( function(prop) if prop == "AbsoluteSize" then recalculate() end end) frame.AncestryChanged:connect(recalculate) layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) end t.CreateSlider = function(steps,width,position) local sliderGui = Instance.new("Frame") sliderGui.Size = UDim2.new(1,0,1,0) sliderGui.BackgroundTransparency = 1 sliderGui.Name = "SliderGui" local 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 areaSoak.Parent = sliderGui local sliderPosition = Instance.new("IntValue") sliderPosition.Name = "SliderPosition" sliderPosition.Value = 0 sliderPosition.Parent = sliderGui local id = math.random(1,100) local bar = Instance.new("Frame") bar.Name = "Bar" bar.BackgroundColor3 = Color3.new(0,0,0) if type(width) == "number" then bar.Size = UDim2.new(0,width,0,5) else bar.Size = UDim2.new(0,200,0,5) end 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 end local 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 local areaSoakMouseMoveCon = nil areaSoak.MouseLeave:connect(function() if areaSoak.Visible then cancelSlide(areaSoak) end end) areaSoak.MouseButton1Up:connect(function() if areaSoak.Visible then cancelSlide(areaSoak) end end) slider.MouseButton1Down:connect(function() areaSoak.Visible = true if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x,y) setSliderPos(x,slider,sliderPosition,bar,steps) end) end) slider.MouseButton1Up:connect(function() cancelSlide(areaSoak) end) sliderPosition.Changed:connect(function(prop) local relativePosX = (sliderPosition.Value - 1) / steps slider.Position = UDim2.new(relativePosX,0,slider.Position.Y.Scale,slider.Position.Y.Offset) end) return sliderGui, sliderPosition end t.CreateScrollingFrame = function(orderList,scrollStyle) local frame = Instance.new("Frame") frame.Name = "ScrollingFrame" frame.BackgroundTransparency = 1 frame.Size = UDim2.new(1,0,1,0) local 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) local 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) local style = "simple" if scrollStyle and tostring(scrollStyle) then style = scrollStyle end local scrollPosition = 1 local rowSize = 1 local layoutGridScrollBar = function() local guiObjects = {} if orderList then for i, child in ipairs(orderList) do if child.Parent == frame then table.insert(guiObjects, child) end end else local children = frame:GetChildren() if children then for i, child in ipairs(children) do if child:IsA("GuiObject") then table.insert(guiObjects, child) end end end end if #guiObjects == 0 then scrollUpButton.Active = false scrollDownButton.Active = false scrollPosition = 1 return end if scrollPosition > #guiObjects then scrollPosition = #guiObjects end local totalPixelsY = frame.AbsoluteSize.Y local pixelsRemainingY = frame.AbsoluteSize.Y local totalPixelsX = frame.AbsoluteSize.X local xCounter = 0 local rowSizeCounter = 0 local setRowSize = true local pixelsBelowScrollbar = 0 local pos = #guiObjects while pixelsBelowScrollbar < totalPixelsY and pos >= 1 do if pos >= scrollPosition then pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y else xCounter = xCounter + guiObjects[pos].AbsoluteSize.X rowSizeCounter = rowSizeCounter + 1 if xCounter >= totalPixelsX then if setRowSize then rowSize = rowSizeCounter - 1 setRowSize = false end rowSizeCounter = 0 xCounter = 0 if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixelsY then pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y if scrollPosition <= rowSize then scrollPosition = rowSize break else scrollPosition = scrollPosition - rowSize end else break end end end pos = pos - 1 end xCounter = 0 pos = scrollPosition rowSizeCounter = 0 setRowSize = true local lastChildSize = 0 local xOffset,yOffset = 0 if guiObjects[1] then yOffset = math.ceil(math.floor(math.fmod(totalPixelsY,guiObjects[1].AbsoluteSize.X))/2) xOffset = math.ceil(math.floor(math.fmod(totalPixelsX,guiObjects[1].AbsoluteSize.Y))/2) end for i, child in ipairs(guiObjects) do if i < scrollPosition then child.Visible = false else if pixelsRemainingY < 0 then child.Visible = false else if setRowSize then rowSizeCounter = rowSizeCounter + 1 end if xCounter + child.AbsoluteSize.X >= totalPixelsX then if setRowSize then rowSize = rowSizeCounter - 1 setRowSize = false end xCounter = 0 pixelsRemainingY = pixelsRemainingY - child.AbsoluteSize.Y end child.Position = UDim2.new(child.Position.X.Scale,xCounter + xOffset, 0, totalPixelsY - pixelsRemainingY + yOffset) xCounter = xCounter + child.AbsoluteSize.X child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) lastChildSize = child.AbsoluteSize end end end scrollUpButton.Active = (scrollPosition > 1) if lastChildSize == 0 then scrollDownButton.Active = false else scrollDownButton.Active = ((pixelsRemainingY - lastChildSize.Y) < 0) end end local layoutSimpleScrollBar = function() local guiObjects = {} if orderList then for i, child in ipairs(orderList) do if child.Parent == frame then table.insert(guiObjects, child) end end else local children = frame:GetChildren() if children then for i, child in ipairs(children) do if child:IsA("GuiObject") then table.insert(guiObjects, child) end end end end if #guiObjects == 0 then scrollUpButton.Active = false scrollDownButton.Active = false scrollPosition = 1 return end if scrollPosition > #guiObjects then scrollPosition = #guiObjects end local totalPixels = frame.AbsoluteSize.Y local pixelsRemaining = frame.AbsoluteSize.Y local pixelsBelowScrollbar = 0 local pos = #guiObjects while pixelsBelowScrollbar < totalPixels and pos >= 1 do if pos >= scrollPosition then pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y else if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels then pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y if scrollPosition <= 1 then scrollPosition = 1 break else scrollPosition = scrollPosition - 1 end else break end end pos = pos - 1 end pos = scrollPosition for i, child in ipairs(guiObjects) do if i < scrollPosition then child.Visible = false else if pixelsRemaining < 0 then child.Visible = false else child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y child.Visible = (pixelsRemaining >= 0) end end end scrollUpButton.Active = (scrollPosition > 1) scrollDownButton.Active = (pixelsRemaining < 0) end local reentrancyGuard = false local recalculate = function() if reentrancyGuard then return end reentrancyGuard = true wait() local success, err = nil if style == "grid" then success, err = pcall(function() layoutGridScrollBar(frame) end) elseif style == "simple" then success, err = pcall(function() layoutSimpleScrollBar(frame) end) end if not success then print(err) end reentrancyGuard = false end local scrollUp = function() if scrollUpButton.Active then scrollPosition = scrollPosition - rowSize recalculate() end end local scrollDown = function() if scrollDownButton.Active then scrollPosition = scrollPosition + rowSize recalculate() end end local scrollMouseCount = 0 scrollUpButton.MouseButton1Click:connect( function() scrollMouseCount = scrollMouseCount + 1 end) scrollUpButton.MouseLeave:connect( function() scrollMouseCount = scrollMouseCount + 1 end) scrollUpButton.MouseButton1Down:connect( function() scrollMouseCount = scrollMouseCount + 1 scrollUp() local val = scrollMouseCount wait(0.5) while val == scrollMouseCount do if scrollUp() == false then break end wait(0.1) end end) scrollDownButton.MouseButton1Click:connect( function() scrollMouseCount = scrollMouseCount + 1 end) scrollDownButton.MouseLeave:connect( function() scrollMouseCount = scrollMouseCount + 1 end) scrollDownButton.MouseButton1Down:connect( function() scrollMouseCount = scrollMouseCount + 1 scrollDown() local val = scrollMouseCount wait(0.5) while val == scrollMouseCount do if scrollDown() == false then break end wait(0.1) end end) frame.ChildAdded:connect(function() recalculate() end) frame.ChildRemoved:connect(function() recalculate() end) frame.Changed:connect( function(prop) if prop == "AbsoluteSize" then recalculate() end end) frame.AncestryChanged:connect(recalculate) return frame, scrollUpButton, scrollDownButton, recalculate end local function binaryGrow(min, max, fits) if min > max then return min end local biggestLegal = min while min <= max do local mid = min + math.floor((max - min) / 2) if fits(mid) and (biggestLegal == nil or biggestLegal < mid) then biggestLegal = mid min = mid + 1 else max = mid - 1 end end return biggestLegal end local function binaryShrink(min, max, fits) if min > max then return min end local smallestLegal = max while min <= max do local mid = min + math.floor((max - min) / 2) if fits(mid) and (smallestLegal == nil or smallestLegal > mid) then smallestLegal = mid max = mid - 1 else min = mid + 1 end end return smallestLegal end local function getGuiOwner(instance) while instance ~= nil do if instance:IsA("ScreenGui") or instance:IsA("BillboardGui") then return instance end instance = instance.Parent end return nil end t.AutoTruncateTextObject = function(textLabel) local text = textLabel.Text textLabel.TextColor3 = Color3.new(1,1,1) local fullLabel = textLabel:Clone() fullLabel.Name = "Full" .. textLabel.Name fullLabel.BorderSizePixel = 0 fullLabel.BackgroundTransparency = 0 fullLabel.Text = text fullLabel.TextXAlignment = Enum.TextXAlignment.Center fullLabel.Position = UDim2.new(0,-3,0,0) fullLabel.Size = UDim2.new(0,00,0,0) fullLabel.Visible = false fullLabel.Parent = textLabel fullLabel.TextTransparency= 1 local shortText = nil local mouseEnterConnection = nil local mouseLeaveConnection= nil local checkForResize = function() if getGuiOwner(textLabel) == nil then return end textLabel.Text = text if textLabel.TextFits then if mouseEnterConnection then mouseEnterConnection:disconnect() mouseEnterConnection = nil end if mouseLeaveConnection then mouseLeaveConnection:disconnect() mouseLeaveConnection = nil end else local len = string.len(text) textLabel.Text = text .. "~" local textSize = binaryGrow(0, len, function(pos) if pos == 0 then textLabel.Text = "~" else textLabel.Text = string.sub(text, 1, pos) .. "~" end return textLabel.TextFits end) shortText = string.sub(text, 1, textSize) .. "~" textLabel.Text = shortText if not fullLabel.TextFits then fullLabel.Size = UDim2.new(0, 0, 0, 0) end local fullLabelSize = binaryShrink(textLabel.AbsoluteSize.X,fullLabel.AbsoluteSize.X, function(size) fullLabel.Size = UDim2.new(0, 0, 0, 0) return fullLabel.TextFits end) fullLabel.Size = UDim2.new(0,0,0,0) if mouseEnterConnection == nil then mouseEnterConnection = textLabel.MouseEnter:connect( function() fullLabel.ZIndex = textLabel.ZIndex + 1 fullLabel.Visible = false end) end if mouseLeaveConnection == nil then mouseLeaveConnection = textLabel.MouseLeave:connect( function() fullLabel.Visible = false end) end end end textLabel.AncestryChanged:connect(checkForResize) textLabel.Changed:connect( function(prop) if prop == "AbsoluteSize" then checkForResize() end end) checkForResize() local function changeText(newText) text = newText fullLabel.Text = text checkForResize() end return textLabel, changeText end local function TransitionTutorialPages(fromPage, toPage, transitionFrame, currentPageValue) if fromPage then fromPage.Visible = false if transitionFrame.Visible == false then transitionFrame.Size = fromPage.Size transitionFrame.Position = fromPage.Position end else if transitionFrame.Visible == false then transitionFrame.Size = UDim2.new(0.0,50,0.0,50) transitionFrame.Position = UDim2.new(0.5,-25,0.5,-25) end end transitionFrame.Visible = true currentPageValue.Value = nil local newsize, newPosition if toPage then toPage.Visible = true newSize = toPage.Size newPosition = toPage.Position toPage.Visible = false else newSize = UDim2.new(0.0,50,0.0,50) newPosition = UDim2.new(0.5,-25,0.5,-25) end transitionFrame:TweenSizeAndPosition(newSize, newPosition, Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.3, true, function(state) if state == Enum.TweenStatus.Completed then transitionFrame.Visible = false if toPage then toPage.Visible = true currentPageValue.Value = toPage end end end) end t.CreateTutorial = function(name, tutorialKey, createButtons) local frame = 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) local 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 local currentPageValue = Instance.new("ObjectValue") currentPageValue.Name = "CurrentTutorialPage" currentPageValue.Value = nil currentPageValue.Parent = frame local boolValue = Instance.new("BoolValue") boolValue.Name = "Buttons" boolValue.Value = createButtons boolValue.Parent = frame local pages = Instance.new("Frame") pages.Name = "Pages" pages.BackgroundTransparency = 1 pages.Size = UDim2.new(1,0,1,0) pages.Parent = frame local function getVisiblePageAndHideOthers() local visiblePage = nil local children = pages:GetChildren() if children then for i,child in ipairs(children) do if child.Visible then if visiblePage then child.Visible = false else visiblePage = child end end end end return visiblePage end local showTutorial = function(alwaysShow) if alwaysShow or UserSettings().GameSettings:GetTutorialState(tutorialKey) == false then print("Showing tutorial-",tutorialKey) local currentTutorialPage = getVisiblePageAndHideOthers() local firstPage = pages:FindFirstChild("TutorialPage1") if firstPage then TransitionTutorialPages(currentTutorialPage, firstPage, transitionFrame, currentPageValue) else error("Could not find TutorialPage1") end end end local dismissTutorial = function() local currentTutorialPage = getVisiblePageAndHideOthers() if currentTutorialPage then TransitionTutorialPages(currentTutorialPage, nil, transitionFrame, currentPageValue) end UserSettings().GameSettings:SetTutorialState(tutorialKey, true) end local gotoPage = function(pageNum) local page = pages:FindFirstChild("TutorialPage" .. pageNum) local currentTutorialPage = getVisiblePageAndHideOthers() TransitionTutorialPages(currentTutorialPage, page, transitionFrame, currentPageValue) end return frame, showTutorial, dismissTutorial, gotoPage end local function CreateBasicTutorialPage(name, handleResize, skipTutorial) local 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 local 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 local skipButton = Instance.new("ImageButton") skipButton.Name = "SkipButton" skipButton.AutoButtonColor = false skipButton.BackgroundTransparency = 1 skipButton.Image = "http://www.roblox.com/asset/?id=37813546" skipButton.MouseButton1Click:connect(function() skipButton.Image = "http://www.roblox.com/asset/?id=37813546" skipTutorial() end) skipButton.MouseEnter:connect(function() skipButton.Image = "http://www.roblox.com/asset/?id=37813556" end) skipButton.MouseLeave:connect(function() skipButton.Image = "http://www.roblox.com/asset/?id=37813546" end) skipButton.Size = UDim2.new(0, 55, 0, 22) skipButton.Position = UDim2.new(1, -55, 0, 0) skipButton.Parent = frame local innerFrame = Instance.new("Frame") innerFrame.Name = "ContentFrame" innerFrame.BackgroundTransparency = 1 innerFrame.Position = UDim2.new(0,0,0,22) innerFrame.Parent = frame local 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 local 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 innerFrame.Size = UDim2.new(1,0,1,-22-35) local parentConnection = nil local function basicHandleResize() if frame.Visible and frame.Parent then local maxSize = math.min(frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y) handleResize(200,maxSize) end end frame.Changed:connect( function(prop) if prop == "Parent" then if parentConnection ~= nil then parentConnection:disconnect() parentConnection = nil end if frame.Parent and frame.Parent:IsA("GuiObject") then parentConnection = frame.Parent.Changed:connect( function(parentProp) if parentProp == "AbsoluteSize" then wait() basicHandleResize() end end) basicHandleResize() end end if prop == "Visible" then basicHandleResize() end end) return frame, innerFrame end t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) local frame = nil local contentFrame = nil local 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) local function handleResize(minSize, maxSize) size = binaryShrink(minSize, maxSize, function(size) frame.Size = UDim2.new(0, size, 0, size) return textLabel.TextFits end) frame.Size = UDim2.new(0, size, 0, size) frame.Position = UDim2.new(0.5, -size/2, 0.5, -size/2) end frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) textLabel.Parent = contentFrame return frame end t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc) local frame = nil local contentFrame = nil local 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) local function handleResize(minSize, maxSize) size = binaryShrink(minSize, maxSize, function(size) return size >= x and size >= y end) if size >= x and size >= y then imageLabel.Size = UDim2.new(0,x, 0,y) imageLabel.Position = UDim2.new(0.5,-x/2, 0.5, -y/2) else if x > y then imageLabel.Size = UDim2.new(1,0,y/x,0) imageLabel.Position = UDim2.new(0,0, 0.5 - (y/x)/2, 0) else imageLabel.Size = UDim2.new(x/y,0,1, 0) imageLabel.Position = UDim2.new(0.5-(x/y)/2, 0, 0, 0) end end frame.Size = UDim2.new(0, size, 0, size) frame.Position = UDim2.new(0.5, -size/2, 0.5, -size/2) end frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) imageLabel.Parent = contentFrame return frame end t.AddTutorialPage = function(tutorial, tutorialPage) local transitionFrame = tutorial.TransitionFrame local currentPageValue = tutorial.CurrentTutorialPage if not tutorial.Buttons.Value then tutorialPage.ContentFrame.Size = UDim2.new(1,0,1,-22) tutorialPage.NextButton.Parent = nil tutorialPage.PrevButton.Parent = nil end local children = tutorial.Pages:GetChildren() if children and #children > 0 then tutorialPage.Name = "TutorialPage" .. (#children+1) local previousPage = children[#children] if not previousPage:IsA("GuiObject") then error("All elements under Pages must be GuiObjects") end if tutorial.Buttons.Value then if previousPage.NextButton.Active then error("NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function") end previousPage.NextButton.MouseButton1Click:connect( function() TransitionTutorialPages(previousPage, tutorialPage, transitionFrame, currentPageValue) end) previousPage.NextButton.Active = true previousPage.NextButton.Visible = true if tutorialPage.PrevButton.Active then error("PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function") end tutorialPage.PrevButton.MouseButton1Click:connect( function() TransitionTutorialPages(tutorialPage, previousPage, transitionFrame, currentPageValue) end) tutorialPage.PrevButton.Active = true tutorialPage.PrevButton.Visible = true end tutorialPage.Parent = tutorial.Pages else tutorialPage.Name = "TutorialPage1" tutorialPage.Parent = tutorial.Pages end end t.Help = function(funcNameOrFunc) if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu then return "Function CreatePropertyDropDownMenu. " .. "Arguments: (instance, propertyName, enumType). " .. "Side effect: returns a container with a drop-down-box that is linked to the property field of instance which is of type enumType" end if funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu then return "Function CreateDropDownMenu. " .. "Arguments: (items, onItemSelected). " .. "Side effect: Returns 2 results, a container to the gui object and a updateSelection function for external updating. The container is a drop-down-box created around a list of items" end if funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog then return "Function CreateMessageDialog. " .. "Arguments: (title, message, buttons). " .. "Side effect: Returns a gui object of a message box with title and message as passed in. buttons input is an array of Tables contains a Text and Function field for the text/callback of each button" end if funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog then return "Function CreateStyledMessageDialog. " .. "Arguments: (title, message, style, buttons). " .. "Side effect: Returns a gui object of a message box with title and message as passed in. buttons input is an array of Tables contains a Text and Function field for the text/callback of each button, style is a string, either Error, Notify or Confirm" end if funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight then return "Function GetFontHeight. " .. "Arguments: (font, fontSize). " .. "Side effect: returns the size in pixels of the given font + fontSize" end if funcNameOrFunc == "LayoutGuiObjects" or funcNameOrFunc == t.LayoutGuiObjects then end if funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame then return "Function CreateScrollingFrame. " .. "Arguments: (orderList, style) " .. "Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). scrollFrame can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a grid styling if style is passed grid as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)" end if funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject then return "Function AutoTruncateTextObject. " .. "Arguments: (textLabel) " .. "Side effect: returns 2 objects, (textLabel, changeText). The textLabel input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. changeText is a function that can be used to change the text, it takes 1 string as an argument" end if funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider then return "Function CreateSlider. " .. "Arguments: (steps, width, position) " .. "Side effect: returns 2 objects, (sliderGui, sliderPosition). The steps argument specifies how many different positions the slider can hold along the bar. width specifies in pixels how wide the bar should be (modifiable afterwards if desired). position argument should be a UDim2 for slider positioning. sliderPosition is an IntValue whose current .Value specifies the specific step the slider is currently on." end end local RbxGui local friendWord = "Friend" local friendWordLowercase = "friend" local bigEasingStyle = Enum.EasingStyle.Back local smallEasingStyle = Enum.EasingStyle.Quart local lightBackground = true local function waitForChild(instance, name) coroutine.resume(coroutine.create(function() while not instance:FindFirstChild(name) do instance.ChildAdded:wait() end end)) end local function waitForProperty(instance, prop) end local function Color3I(r,g,b) return Color3.new(r/255,g/255,b/255) end function robloxLock(instance) end function ArrayRemove(t, obj) for i, obj2 in ipairs(t) do if obj == obj2 then table.remove(t, i) return true end end return false end local function getPlayers() local result = {} local players = game:GetService("Players"):GetChildren() if players then for i, player in ipairs(players) do if player:IsA("Player") then table.insert(result, player) end end end return result end local brickColorTable = {} for i = 0, 63 do brickColorTable[BrickColor.palette(i).Name] = BrickColor.palette(i).Color end local function remapColor(i, j) brickColorTable[BrickColor.palette(i).Name] = BrickColor.palette(j).Color end remapColor(13, 12) remapColor(14, 12) remapColor(15, 12) remapColor(61, 29) remapColor(63, 62) remapColor(56, 50) remapColor(45, 53) remapColor(51, 20) remapColor(4, 20) remapColor(59, 35) remapColor(60, 29) local function getColor(brickColor) if brickColorTable[brickColor.Name] then return brickColorTable[brickColor.Name] else return brickColor.Color; end end local function getTeams() local result = {} local teams = game:GetService("Teams"):GetChildren() for i, team in ipairs(teams) do if team:IsA("Team") then table.insert(result, team) end end return result end local supportFriends = false local currentBoardType = "PlayerList" local currentStatCount = 0 local createBoardsFunction = nil local playerTable = {} local teamTable = {} local teamColorTable = {} local removePlayerFunction = nil local recreatePlayerFunction = nil local addPlayerFunction = function(player) if recreatePlayerFunction then recreatePlayerFunction(player) end end local sortPlayerListsFunction = nil local minimizedState = nil local bigWindowImposter = nil local smallWindowPosition = UDim2.new(0, -20, 0,5) local smallWindowSize = UDim2.new(1,0,1,0) local bigWindowSize = UDim2.new(0.6,0,0.6,0) local bigWindowPosition = UDim2.new(.2, 0, .2,0) local debounceTeamsChanged = false local currentWindowState = "Small" local previousWindowState = nil local transitionWindowsFunction = nil local container = nil local topRightTrayContainer = nil local playerContextMenu = nil local contextMenuElements = {} local function addContextMenuLabel(getText1, getText2, isVisible) local t = {} t.Type = "Label" t.GetText1 = getText1 t.GetText2 = getText2 t.IsVisible = isVisible table.insert(contextMenuElements, t) end local function addContextMenuButton(text, isVisible, isActive, doIt) local t = {} t.Text = text t.Type = "Button" t.IsVisible = isVisible t.IsActive = isActive t.DoIt = doIt table.insert(contextMenuElements, t) end local function getFriendStatus(player) if player == game.Players.LocalPlayer then return Enum.FriendStatus.NotFriend else return Enum.FriendStatus.NotFriend end end addContextMenuLabel( function(player) return "Loading..." end, nil, function(player) return getFriendStatus(player) == Enum.FriendStatus.Unknown end) addContextMenuButton("Send " .. friendWord .. " Request", function(player) return getFriendStatus(player) == Enum.FriendStatus.NotFriend end, function(player) return true end, function(player) return game.Players.LocalPlayer:RequestFriendship(player) end ) addContextMenuButton("Un" .. friendWordLowercase, function(player) return getFriendStatus(player) == Enum.FriendStatus.Friend end, function(player) return true end, function(player) end ) addContextMenuButton("Accept " .. friendWord .. " Request", function(player) return getFriendStatus(player) == Enum.FriendStatus.FriendRequestReceived end, function(player) return true end, function(player) end ) addContextMenuButton("Deny " .. friendWord .. " Request", function(player) return getFriendStatus(player) == Enum.FriendStatus.FriendRequestReceived end, function(player) return true end, function(player) return game.Players.LocalPlayer:RevokeFriendship(player) end ) addContextMenuButton("Cancel " .. friendWord .. " Request", function(player) return getFriendStatus(player) == Enum.FriendStatus.FriendRequestSent end, function(player) return true end, function(player) return game.Players.LocalPlayer:RevokeFriendship(player) end ) local function getStatColumns(players) for i, player in ipairs(players) do local leaderstats = player:FindFirstChild("leaderstats") if leaderstats then local stats = {} local children = leaderstats:GetChildren() if children then for i, stat in ipairs(children) do if stat:IsA("IntValue") then table.insert(stats, stat.Name) else table.insert(stats, stat.Name) end end end return stats end end return nil end local function determineBoardType() local players = getPlayers() local foundLeaderstats = false local numStats = 0 local foundTeam = false local stats = getStatColumns(players) if stats then foundLeaderstats = true numStats = #stats end for i, player in ipairs(players) do if not foundTeam then if not player.Neutral then foundTeam = true break end end end if foundLeaderstats and foundTeam then return "TeamScore", numStats elseif foundLeaderstats then return "PlayerScore", numStats elseif foundTeam then return "TeamList", numStats else return "PlayerList", numStats end end local function toggleBigWindow() if container == nil then return end if currentWindowState == "Big" then if previousWindowState == nil or previousWindowState == "Big" or previousWindowState == "None" then transitionWindowsFunction("None") else transitionWindowsFunction("Small") end else previousWindowState = currentWindowState transitionWindowsFunction("Big") end end local previousBigPlayerList = nil local function rebuildBoard(owner, boardType, numStats) print("RebuildBoard") if topRightTrayContainer == nil then topRightTrayContainer = owner:FindFirstChild("PlayerListTopRightFrame") if topRightTrayContainer == nil then topRightTrayContainer = Instance.new("Frame") topRightTrayContainer.Name = "PlayerListTopRightFrame" topRightTrayContainer.BackgroundTransparency = 1 topRightTrayContainer.Size = UDim2.new(0.2, 16, 0.42, 16) topRightTrayContainer.Position = UDim2.new(0.8, 0, 0, 0) topRightTrayContainer.Parent = container end end if minimizedState == nil then minimizedState = Instance.new("Frame") minimizedState.Name = "MinimizedPlayerlist" minimizedState.BackgroundTransparency = 1 minimizedState.Position = UDim2.new(1, -166, 0,0) minimizedState.Size = UDim2.new(0, 151, 0, 30) playerListButton = Instance.new("ImageButton") playerListButton.Name = "GoSmallButton" playerListButton.Image = "rbxasset://textures/ui/playerlist_hidden_small.png" playerListButton.BackgroundTransparency = 1 playerListButton.Size = UDim2.new(0.0, 35, 0, 30) playerListButton.Position = UDim2.new(1, -35, 0, 0) playerListButton.MouseButton1Click:connect( function() transitionWindowsFunction("Small") end) playerListButton.Parent = minimizedState minimizedState.Visible = false robloxLock(minimizedState) minimizedState.Parent = topRightTrayContainer end if bigWindowImposter == nil then bigWindowImposter = owner:FindFirstChild("BigPlayerListWindowImposter") if bigWindowImposter == nil then bigWindowImposter = Instance.new("Frame") bigWindowImposter.Name = "BigPlayerListWindowImposter" bigWindowImposter.Visible = false bigWindowImposter.BackgroundColor3 = Color3.new(0,0,0) bigWindowImposter.BackgroundTransparency = 0.7 bigWindowImposter.BorderSizePixel = 0 bigWindowImposter.Size = UDim2.new(0.4, 7, 0.4, 7) bigWindowImposter.Position = UDim2.new(0.3, 0, 0.3, 0) robloxLock(bigWindowImposter) bigWindowImposter.Parent = container end end if container == nil or container ~= owner then container = owner topRightTrayContainer.Parent = container bigWindowImposter.Parent = container end local smallVisible = true local bigVisible = false if container then if topRightTrayContainer then if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then smallVisible = topRightTrayContainer.SmallPlayerlist.Visible topRightTrayContainer.SmallPlayerlist.Parent = nil print("Removed small playerlist") else print("Did not remove small playerlist") end end if container:FindFirstChild("BigPlayerlist") then bigVisible = container.BigPlayerlist.Visible or (previousBigPlayerList ~= nil) container.BigPlayerlist.Parent = nil if previousBigPlayerList ~= nil then pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) previousBigPlayerList = nil end end end local smallBoard, bigBoard = createBoardsFunction(boardType, numStats) if smallBoard then smallBoard.Visible = smallVisible smallBoard.Parent = topRightTrayContainer end if bigBoard then if bigVisible then previousBigPlayerList = bigBoard local centerDialogSupported, msg = pcall(function() game.GuiService:AddCenterDialog(previousBigPlayerList, Enum.CenterDialogType.PlayerInitiatedDialog, function() previousBigPlayerList.Visible = true end) end) bigBoard.Visible = bigVisible else bigBoard.Visible = false end bigBoard.Parent = container end return container end local function showBigPlayerWindow() if container:FindFirstChild("BigPlayerlist") then if container.BigPlayerlist.Visible then return end end bigWindowImposter.Visible = true bigWindowImposter:TweenSizeAndPosition(bigWindowSize, bigWindowPosition, Enum.EasingDirection.Out, bigEasingStyle, 0.3, true, function(state) if state == Enum.TweenStatus.Completed then bigWindowImposter.Visible = false if container:FindFirstChild("BigPlayerlist") then container.BigPlayerlist.Visible = true end end end) end local function hideBigPlayerWindow(completed) if playerContextMenu then playerContextMenu.Visible = false end if container:FindFirstChild("BigPlayerlist") then if container.BigPlayerlist.Visible == false and bigWindowImposter.Visible == false then if completed then completed() end return end container.BigPlayerlist.Visible = false end local completedFunction = completed bigWindowImposter.Visible = true bigWindowImposter:TweenSizeAndPosition(UDim2.new(0.4, 0, 0.4, 0), UDim2.new(0.3, 0, 0.3, 0), Enum.EasingDirection.In, Enum.EasingStyle.Quart, 0.15, true, function(state) if state == Enum.TweenStatus.Completed then bigWindowImposter.Visible = false if completedFunction then completedFunction() end end end) end local function hideSmallPlayerWindow(completed) if playerContextMenu then playerContextMenu.Visible = false end if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then local completedFunction = completed if topRightTrayContainer.SmallPlayerlist.Visible then topRightTrayContainer.SmallPlayerlist:TweenPosition(UDim2.new(1,0,smallWindowPosition.Y.Scale, smallWindowPosition.Y.Offset), Enum.EasingDirection.Out, smallEasingStyle, 0.3, true, function(state) if state == Enum.TweenStatus.Completed then if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then topRightTrayContainer.SmallPlayerlist.Visible = false end if completedFunction then completedFunction() end end end) return end end if completed then completed() end end transitionWindowsFunction = function(desiredState) if desiredState == "Big" then minimizedState.Visible = false hideSmallPlayerWindow() if previousBigPlayerList ~= nil then if previousBigPlayerList ~= container:FindFirstChild("BigPlayerlist") then pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) previousBigPlayerList = nil previousBigPlayerList = container:FindFirstChild("BigPlayerlist") end else previousBigPlayerList = container:FindFirstChild("BigPlayerlist") end if previousBigPlayerList then local firstShow = false local centerDialogSupported, msg = pcall(function() game.GuiService:AddCenterDialog(previousBigPlayerList, Enum.CenterDialogType.PlayerInitiatedDialog, function() if not firstShow then showBigPlayerWindow() firstShow = true else previousBigPlayerList.Visible = true end end) end) if centerDialogSupported == false then print("Exception", msg) showBigPlayerWindow() end else showBigPlayerWindow() end currentWindowState = "Big" elseif desiredState == "Small" then minimizedState.Visible = false if previousBigPlayerList ~= nil then pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) previousBigPlayerList = nil end hideBigPlayerWindow() if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then if not topRightTrayContainer.SmallPlayerlist.Visible or topRightTrayContainer.SmallPlayerlist.Position ~= smallWindowPosition then topRightTrayContainer.SmallPlayerlist.Visible = true topRightTrayContainer.SmallPlayerlist:TweenPosition(smallWindowPosition, Enum.EasingDirection.Out, smallEasingStyle, 0.3, true) end end currentWindowState = "Small" elseif desiredState == "None" then if previousBigPlayerList ~= nil then pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) previousBigPlayerList = nil end local smallDone = false local bigDone = false hideSmallPlayerWindow( function() smallDone = true if bigDone and smallDone then minimizedState.Visible = true end end) hideBigPlayerWindow( function() bigDone = true if bigDone and smallDone then minimizedState.Visible = true end end) currentWindowState = "None" end end local function getStatValuesForPlayer(player) local leaderstats = player:FindFirstChild("leaderstats") if leaderstats then local children = leaderstats:GetChildren() if children then local result = {} for i, stat in ipairs(children) do table.insert(result, stat) end return result, leaderstats end end return nil end if UserSettings and LoadLibrary then RbxGui,msg = t print("Libraries loaded") local function createTeamName(name, color) local fontHeight = 20 local frame = Instance.new("Frame") frame.Name = "Team-" .. name frame.BorderSizePixel = 0 frame.BackgroundTransparency = 0.5 frame.BackgroundColor3 = Color3.new(1,1,1) frame.Size = UDim2.new(1, 0, 0, fontHeight) frame.Position = UDim2.new(0,0,0,0) local label = Instance.new("TextLabel") label.Name = "NameLabel" label.Text = " " .. name label.Font = Enum.Font.ArialBold label.FontSize = Enum.FontSize.Size18 label.Position = UDim2.new(0,0,0,0) label.Size = UDim2.new(1,0,1,0) label.TextColor3 = Color3.new(1,1,1) label.BackgroundTransparency = 0.5 label.BackgroundColor3 = getColor(color) label.BorderSizePixel = 0 label.TextXAlignment = Enum.TextXAlignment.Left label = RbxGui.AutoTruncateTextObject(label) label.Parent = frame return frame end local function getFriendStatusIcon(friendStatus) if friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend then return nil elseif friendStatus == Enum.FriendStatus.Friend then return "rbxasset://textures/ui/PlayerlistFriendIcon.png" elseif friendStatus == Enum.FriendStatus.FriendRequestSent then return "rbxasset://textures/ui/PlayerlistFriendRequestSentIcon.png" elseif friendStatus == Enum.FriendStatus.FriendRequestReceived then return "rbxasset://textures/ui/PlayerlistFriendRequestReceivedIcon.png" else error("Unknown FriendStatus: " .. friendStatus) end end local function getMembershipTypeIcon(membershipType) if membershipType == Enum.MembershipType.None then return "" elseif membershipType == Enum.MembershipType.BuildersClub then return "rbxasset://textures/ui/TinyBcIcon.png" elseif membershipType == Enum.MembershipType.TurboBuildersClub then return "rbxasset://textures/ui/TinyTbcIcon.png" elseif membershipType == Enum.MembershipType.OutrageousBuildersClub then return "rbxasset://textures/ui/TinyObcIcon.png" else error("Uknown membershipType" .. membershipType) end end local function updatePlayerFriendStatus(nameObject, friendStatus) local fontHeight = 20 local friendIconImage = getFriendStatusIcon(friendStatus) nameObject.MembershipTypeLabel.FriendStatusLabel.Visible = (friendIconImage ~= nil) if friendIconImage ~= nil then nameObject.MembershipTypeLabel.FriendStatusLabel.Image = friendIconImage nameObject.NameLabel.Position =UDim2.new(0,2*fontHeight,0,1) nameObject.NameLabel.Size = UDim2.new(1,-2*fontHeight,1,-2) else nameObject.NameLabel.Position = UDim2.new(0,fontHeight+1,0,1) nameObject.NameLabel.Size = UDim2.new(1,-(fontHeight+1),1,-2) end end local function updatePlayerName(nameObject, membershipStatus, teamColor) local fontHeight = 20 nameObject.Size = UDim2.new(1,0,0,fontHeight) nameObject.MembershipTypeLabel.Image = tags[string.lower(nameObject.NameLabel.FullNameLabel.Text)] or "" end local function updatePlayerNameColor(player, teamColor) local function updatePlayerNameColorHelper(nameObject) if teamColor ~= nil then nameObject.NameLabel.TextColor3 = getColor(teamColor) nameObject.NameLabel.FullNameLabel.TextColor3 = getColor(teamColor) else nameObject.NameLabel.TextColor3 = Color3.new(1,1,1) nameObject.NameLabel.FullNameLabel.TextColor3 = Color3.new(1,1,1) end end updatePlayerNameColorHelper(playerTable[player].NameObjectSmall) updatePlayerNameColorHelper(playerTable[player].NameObjectBig) end local function createPlayerName(name, membershipStatus, teamColor, friendStatus) local frame = Instance.new("Frame") frame.Name = "Player_" .. name if lightBackground then frame.BackgroundColor3 = Color3.new(1,1,1) else frame.BackgroundColor3 = Color3.new(1,1,1) end frame.BackgroundTransparency = 0.5 frame.BorderSizePixel = 0 local membershipStatusLabel = Instance.new("ImageLabel") membershipStatusLabel.Name = "MembershipTypeLabel" membershipStatusLabel.BackgroundTransparency = 1 membershipStatusLabel.Size = UDim2.new(1,0,1,0) membershipStatusLabel.Position = UDim2.new(0,0,0,0) membershipStatusLabel.SizeConstraint = Enum.SizeConstraint.RelativeYY membershipStatusLabel.Parent = frame local friendStatusLabel = Instance.new("ImageLabel") friendStatusLabel.Name = "FriendStatusLabel" friendStatusLabel.Visible = false friendStatusLabel.BackgroundTransparency = 1 friendStatusLabel.Size = UDim2.new(1,0,1,0) friendStatusLabel.Position = UDim2.new(1,0,0,0) friendStatusLabel.Parent = membershipStatusLabel local changeNameFunction local nameLabel = Instance.new("TextLabel") nameLabel.Name = "NameLabel" nameLabel.Text = ""..name nameLabel.Font = Enum.Font.ArialBold nameLabel.FontSize = Enum.FontSize.Size14 nameLabel.TextColor3 = Color3.new(1,1,1) nameLabel.BackgroundTransparency = 1 nameLabel.BackgroundColor3 = Color3.new(0,0,0) nameLabel.TextXAlignment = Enum.TextXAlignment.Left nameLabel, changeNameFunction = RbxGui.AutoTruncateTextObject(nameLabel) nameLabel.Parent = frame updatePlayerName(frame, membershipStatus, teamColor) if supportFriends then updatePlayerFriendStatus(frame, friendStatus) else updatePlayerFriendStatus(frame, Enum.FriendStatus.NotFriend) end return frame, changeNameFunction end local function createStatColumn(i, numColumns, isTeam, color3, isHeader) local textLabel = Instance.new("TextLabel") textLabel.Name = "Stat" .. i textLabel.TextColor3 = Color3.new(1,1,1) textLabel.TextXAlignment = Enum.TextXAlignment.Right textLabel.TextYAlignment = Enum.TextYAlignment.Center textLabel.FontSize = Enum.FontSize.Size14 if isHeader then textLabel.FontSize = Enum.FontSize.Size18 else textLabel.FontSize = Enum.FontSize.Size14 end if isHeader or isTeam then textLabel.Font = Enum.Font.ArialBold else textLabel.Font = Enum.Font.Arial end if isTeam then textLabel.BackgroundColor3 = color3 textLabel.Text = 0 else textLabel.BackgroundColor3 = Color3.new(0,0,0) textLabel.Text = "" end textLabel.BackgroundTransparency = 1 if i == numColumns then textLabel.Size = UDim2.new(1/numColumns, -6, 1, 0) else textLabel.Size = UDim2.new(1/numColumns, -4, 1, 0) end textLabel.Position = UDim2.new((i-1) * (1/numColumns), 0, 0, 0) return RbxGui.AutoTruncateTextObject(textLabel) end local function createStatHeaders(stats, numColumns, isBig) local frame = Instance.new("Frame") frame.Name = "Headers" frame.BorderSizePixel = 0 frame.BackgroundColor3 = Color3.new(0,0,0) frame.BackgroundTransparency = 1 local nameSize if isBig then nameSize = 0.5 elseif numColumns == 1 then nameSize = 0.7 elseif numColumns == 2 then nameSize = 0.6 else nameSize = 0.45 end frame.Size = UDim2.new(1-nameSize, 0, 1,0) if isBig then frame.Position = UDim2.new(nameSize,-25, 0,0) else frame.Position = UDim2.new(nameSize,0, 0,0) end local i = 1 while i <= numColumns do local headerColumn, changeText = createStatColumn(i, numColumns, false, nil, true) changeText(stats[i]) headerColumn.Parent = frame i = i + 1 end return frame, textChangers end local function createStatColumns(nameObject, numColumns, isTeam, isBig) local frame = Instance.new("Frame") frame.Name = nameObject.Name .. "_WithStats" frame.BorderSizePixel = 0 frame.BackgroundColor3 = nameObject.BackgroundColor3 frame.BackgroundTransparency = nameObject.BackgroundTransparency frame.Size = nameObject.Size frame.Position = nameObject.Position nameObject.BackgroundTransparency = 1 if numColumns == 0 then nameObject.Size = UDim2.new(1,0,1,0) nameObject.Position = UDim2.new(0,0,0,0) nameObject.Parent = frame return frame end local statFrame = Instance.new("Frame") statFrame.Name = "Stats" if isTeam then statFrame.BorderSizePixel = 0 statFrame.BackgroundColor3 = nameObject.NameLabel.BackgroundColor3 statFrame.BackgroundTransparency = nameObject.NameLabel.BackgroundTransparency else statFrame.BackgroundTransparency = 1 end local nameSize if isBig then nameSize = 0.5 elseif numColumns == 1 then nameSize = 0.7 elseif numColumns == 2 then nameSize = 0.6 else nameSize = 0.45 end nameObject.Size = UDim2.new(nameSize, 0, 1, 0) nameObject.Position = UDim2.new(0, 0, 0, 0) statFrame.Size = UDim2.new(1-nameSize,0, 1,0) statFrame.Position = UDim2.new(nameSize,0, 0,0) nameObject.Parent = frame statFrame.Parent = frame local textChangers = {} local i = 1 while i <= numColumns do local statColumn, changeText = createStatColumn(i, numColumns, isTeam, statFrame.BackgroundColor3) statColumn.Parent = statFrame table.insert(textChangers, changeText) i = i + 1 end return frame, statFrame, textChangers end local function createAlternatingRows(objects) for i, line in ipairs(objects) do if i % 2 == 0 then line.BackgroundTransparency = 1 else line.BackgroundTransparency = 0.95 end end end local removeFromTeam = nil local function clearTableEntry(obj, tableInfo) if tableInfo.MainObjectSmall then tableInfo.MainObjectSmall.Parent = nil tableInfo.MainObjectSmall = nil end if tableInfo.MainObjectBig then tableInfo.MainObjectBig.Parent = nil tableInfo.MainObjectBig = nil end if tableInfo.Connections then for i, connection in ipairs(tableInfo.Connections) do connection:disconnect() end tableInfo.Connections = nil end if tableInfo.LeaderStatConnections then for i, connection in ipairs(tableInfo.LeaderStatConnections) do connection:disconnect() end tableInfo.LeaderStatConnections = nil end if tableInfo.CurrentTeam then removeFromTeam(obj) tableInfo.CurrentTeam = nil end if tableInfo.Players then for i, player in ipairs(tableInfo.Players) do playerTable[player].CurrentTeam = nil end tableInfo.Players = {} end if tableInfo.StatValues then tableInfo.StatValues = nil end end local function resetPlayerTable() for player, info in pairs(playerTable) do clearTableEntry(player, info) playerTable[player] = nil end playerTable = {} end local function resetTeamTable() for team, info in pairs(teamTable) do clearTableEntry(team, info) teamTable[team] = nil end teamTable = {} teamColorTable = {} end local function getBoardTypeInfo() local isTeam = (currentBoardType == "TeamScore" or currentBoardType == "TeamList") local isScore = (currentBoardType == "TeamScore" or currentBoardType == "PlayerScore") return isTeam, isScore end local function recomputeTeamScore(team, column) if not team or team == "Neutral" then return end local function recomputeScoreHelper(statChangers) if statChangers and column <= #statChangers then local sum = 0 for i, p in ipairs(teamTable[team].Players) do if playerTable[p].StatValues and column <= #playerTable[p].StatValues then sum = sum + (playerTable[p].StatValues[column].Value or 0) end end statChangers[column](sum) end end recomputeScoreHelper(teamTable[team].StatChangersSmall) recomputeScoreHelper(teamTable[team].StatChangersBig) end local function recomputeCompleteTeamScore(team) local col = 1 while col <= currentStatCount do recomputeTeamScore(team, col) col = col + 1 end end removeFromTeam = function(player) if playerTable[player].CurrentTeam ~= nil then ArrayRemove(teamTable[playerTable[player].CurrentTeam].Players, player) recomputeCompleteTeamScore(playerTable[player].CurrentTeam) playerTable[player].CurrentTeam = nil end end local function assignToTeam(player) local isTeam, isScore = getBoardTypeInfo() if isTeam then local newTeam = nil if player.Neutral or teamColorTable[player.TeamColor.Name] == nil then newTeam = "Neutral" else newTeam = teamColorTable[player.TeamColor.Name] end if playerTable[player].CurrentTeam == newTeam then return end removeFromTeam(player) playerTable[player].CurrentTeam = newTeam table.insert(teamTable[newTeam].Players, player) if newTeam == "Neutral" then updatePlayerNameColor(player, nil) else updatePlayerNameColor(player, player.TeamColor) end recomputeCompleteTeamScore(newTeam) if sortPlayerListsFunction then sortPlayerListsFunction() end end end local function buildTeamObject(team, numStatColumns, suffix) local isTeam, isScore = getBoardTypeInfo() local teamObject = createTeamName(team.Name, team.TeamColor) if not teamTable[team] then teamTable[team] = {} end teamTable[team]["NameObject" .. suffix] = teamObject if isScore then local statObject local textChangers teamObject, statObject, textChangers = createStatColumns(teamObject, numStatColumns, true, suffix == "Big") teamTable[team]["StatObject" .. suffix] = statObject teamTable[team]["StatChangers" .. suffix] = textChangers end teamTable[team]["MainObject" .. suffix] = teamObject if not teamTable[team].Players then teamTable[team].Players = {} end return teamObject end local currentContextMenuPlayer = nil local function updatePlayerContextMenu(player) currentContextMenuPlayer = player local elementHeight = 20 local function highlight(button) button.Visible = false button.TextColor3 = Color3.new(0,0,0) button.BackgroundColor3 = Color3.new(0.8,0.8,0.8) end local function clearHighlight(button) button.Visible = false button.TextColor3 = Color3.new(1,1,1) button.BackgroundColor3 = Color3.new(0,0,0) end if playerContextMenu == nil then playerContextMenu = Instance.new("Frame") playerContextMenu.Name = "PlayerListContextMenu" playerContextMenu.BackgroundTransparency = 1 playerContextMenu.Visible = false local playerContextMenuButton = Instance.new("TextButton") playerContextMenuButton.Name = "PlayerListContextMenuButton" playerContextMenuButton.Text = "" playerContextMenuButton.Style = Enum.ButtonStyle.RobloxButtonDefault playerContextMenuButton.ZIndex = 4 playerContextMenuButton.Size = UDim2.new(1, 0, 1, -20) playerContextMenuButton.Visible = true playerContextMenuButton.Parent = playerContextMenu for i, contextElement in ipairs(contextMenuElements) do local element = contextElement if element.Type == "Button" then local button = Instance.new("TextButton") button.Name = "ContextButton" .. i button.BackgroundColor3 = Color3.new(0,0,0) button.BorderSizePixel = 0 button.TextXAlignment = Enum.TextXAlignment.Left button.Text = " " .. contextElement.Text button.Font = Enum.Font.Arial button.FontSize = Enum.FontSize.Size14 button.Size = UDim2.new(1, 8, 0, elementHeight) button.TextColor3 = Color3.new(1,1,1) button.ZIndex = 4 button.Parent = playerContextMenuButton button.MouseButton1Click:connect(function() if button.Active then local success, result = pcall(function() element.DoIt(currentContextMenuPlayer) end) playerContextMenu.Visible = false end end) button.MouseEnter:connect(function() if button.Active then highlight(button) end end) button.MouseLeave:connect(function() if button.Active then clearHighlight(button) end end) contextElement.Button = button contextElement.Element = button elseif element.Type == "Label" then local frame = Instance.new("Frame") frame.Name = "ContextLabel" .. i frame.BackgroundTransparency = 1 frame.Size = UDim2.new(1, 8, 0, elementHeight) local label = Instance.new("TextLabel") label.Name = "Text1" label.BackgroundTransparency = 1 label.BackgroundColor3 = Color3.new(1,1,1) label.BorderSizePixel = 0 label.TextXAlignment = Enum.TextXAlignment.Left label.Font = Enum.Font.ArialBold label.FontSize = Enum.FontSize.Size14 label.Position = UDim2.new(0.0, 0, 0, 0) label.Size = UDim2.new(0.5, 0, 1, 0) label.TextColor3 = Color3.new(1,1,1) label.ZIndex = 4 label.Parent = frame element.Label1 = label if element.GetText2 then label = Instance.new("TextLabel") label.Name = "Text2" label.BackgroundTransparency = 1 label.BackgroundColor3 = Color3.new(1,1,1) label.BorderSizePixel = 0 label.TextXAlignment = Enum.TextXAlignment.Right label.Font = Enum.Font.Arial label.FontSize = Enum.FontSize.Size14 label.Position = UDim2.new(0.5, 0, 0, 0) label.Size = UDim2.new(0.5, 0, 1, 0) label.TextColor3 = Color3.new(1,1,1) label.ZIndex = 4 label.Parent = frame element.Label2 = label end frame.Parent = playerContextMenuButton element.Label = frame element.Element = frame end end playerContextMenu.ZIndex = 4 playerContextMenu.MouseLeave:connect(function() playerContextMenu.Visible = false end) robloxLock(playerContextMenu) playerContextMenu.Parent = PlayerlistScreenGui end local elementPos = 0 for i, contextElement in ipairs(contextMenuElements) do local isVisible = false if contextElement.IsVisible then local success, visible = pcall(function() return contextElement.IsVisible(currentContextMenuPlayer) end) if success then isVisible = visible else print("Error in IsVisible call: " .. visible) end end if contextElement.Type == "Button" then contextElement.Button.Visible = isVisible if contextElement.Button.Visible then isVisible = true clearHighlight(contextElement.Button) if contextElement.IsActive then local success, active = pcall(function() return contextElement.IsActive(currentContextMenuPlayer) end) if success then contextElement.Button.Active = active else print("Error in IsActive call: " .. active) end end if contextElement.Button.Active then contextElement.Button.TextColor3 = Color3.new(1,1,1) else contextElement.Button.TextColor3 = Color3.new(0.7,0.7,0.7) end end elseif contextElement.Type == "Label" then contextElement.Label.Visible = isVisible if contextElement.Label.Visible then local success, text = pcall(function() return contextElement.GetText1(currentContextMenuPlayer) end) if success then contextElement.Label1.Text = " " .. text else print("Error in GetText1 call: " .. text) end if contextElement.GetText2 then local success, text = pcall(function() return contextElement.GetText2(currentContextMenuPlayer) end) if success then contextElement.Label2.Text = " " .. text else print("Error in GetText2 call: " .. text) end end end end if isVisible then contextElement.Element.Position = UDim2.new(0,-4, 0, elementPos * elementHeight - 4) elementPos = elementPos + 1 end end playerContextMenu.Size = UDim2.new(0, 150, 0, elementPos*elementHeight + 13 + 20) end local function showPlayerMenu(player, x, y) updatePlayerContextMenu(player) x = x - (playerContextMenu.AbsoluteSize.X/2) if x + playerContextMenu.AbsoluteSize.X >= PlayerlistScreenGui.AbsoluteSize.X then x = PlayerlistScreenGui.AbsoluteSize.X - playerContextMenu.AbsoluteSize.X end playerContextMenu.Visible = true playerContextMenu.Position = UDim2.new(0, x, 0, y-playerContextMenu.AbsoluteSize.Y) end local function buildPlayerObject(player, numStatColumns, suffix) local isTeam, isScore = getBoardTypeInfo() local playerObject = nil local changePlayerNameFunction = nil local currentColor = nil if isTeam and not player.Neutral then currentColor = player.TeamColor.Color else currentColor = Color3.new(1,1,1) end playerObject, changePlayerNameFunction = createPlayerName(player.Name, player.MembershipType, currentColor, getFriendStatus(player)) if not playerTable[player] then playerTable[player] = {} end if not playerTable[player].Connections then playerTable[player].Connections = {} end if not playerTable[player].CurrentTeam then playerTable[player].CurrentTeam = nil end playerTable[player]["NameObject" .. suffix] = playerObject playerTable[player]["ChangeName" .. suffix] = changePlayerNameFunction if isScore then local statObject = nil local textChangers = nil playerObject, statObject, textChangers = createStatColumns(playerObject, numStatColumns, false, suffix == "Big") playerTable[player]["StatObject" .. suffix]= statObject playerTable[player]["StatChangers" .. suffix] = textChangers local statValues, leaderstats = getStatValuesForPlayer(player) if not statValues or #statValues < numStatColumns then if not playerTable[player].LeaderStatConnections then playerTable[player].LeaderStatConnections = {} end if not leaderstats then table.insert(playerTable[player].LeaderStatConnections, player.ChildAdded:connect( function(child) if child.Name == "leaderstats" then recreatePlayerFunction(player) else table.insert(playerTable[player].LeaderStatConnections, child.Changed:connect( function(prop) if prop == "Name" and child.Name == "leaderstats" then recreatePlayerFunction(player) end end)) end end)) else table.insert(playerTable[player].LeaderStatConnections, leaderstats.ChildAdded:connect( function(child) recreatePlayerFunction(player) end) ) table.insert(playerTable[player].LeaderStatConnections, leaderstats.AncestryChanged:connect( function(child) recreatePlayerFunction(player) end) ) end end if statValues then if not playerTable[player].StatValues then playerTable[player].StatValues = {} end local pos = 1 while pos <= numStatColumns and pos <= #statValues do local currentColumn = pos local statValue = statValues[pos] print(playerTable[player].StatValues) local statChanger = textChangers[pos] local updateStat = function(val) statChanger(tonumber(val) or 0) recomputeTeamScore(playerTable[player].CurrentTeam, currentColumn) end if pos > #playerTable[player].StatValues then table.insert(playerTable[player].StatValues, statValue) end table.insert(playerTable[player].Connections, statValue.Changed:connect(updateStat) ) table.insert(playerTable[player].Connections, statValue.AncestryChanged:connect( function() recreatePlayerFunction(player) end) ) updateStat(statValue.Value) pos = pos + 1 end end end if supportFriends and player ~= game.Players.LocalPlayer and player.userId > 0 and game.Players.LocalPlayer.userId > 0 then local button = Instance.new("TextButton") button.Name = playerObject.Name .. "Button" button.Text = "" button.Active = false button.Size = playerObject.Size button.Position = playerObject.Position button.BackgroundColor3 = playerObject.BackgroundColor3 local secondButton = Instance.new("TextButton") secondButton.Name = playerObject.Name .. "RealButton" secondButton.Text = "" secondButton.BackgroundTransparency = 1 secondButton.BackgroundColor3 = playerObject.BackgroundColor3 local theNameLabel = playerObject:findFirstChild("NameLabel",true) if theNameLabel then theNameLabel.TextColor3 = Color3.new(1,1,1) secondButton.Parent = theNameLabel.FullNameLabel end secondButton.Parent.BackgroundTransparency = 1 secondButton.Parent.Visible = true secondButton.ZIndex = 2 secondButton.Size = UDim2.new(1,0,1,0) local previousTransparency = nil table.insert(playerTable[player].Connections, secondButton.MouseEnter:connect( function() if previousTransparency == nil then previousTransparency = secondButton.BackgroundTransparency end if lightBackground then secondButton.Parent.BackgroundTransparency = 0 else secondButton.Parent.BackgroundTransparency = 1 end end)) table.insert(playerTable[player].Connections, secondButton.MouseLeave:connect( function() if previousTransparency ~= nil then if lightBackground then else end previousTransparency = nil end secondButton.Parent.BackgroundTransparency = 1 end)) local mouseDownX, mouseDownY table.insert(playerTable[player].Connections, secondButton.MouseButton1Down:connect(function(x,y) mouseDownX = x mouseDownY = y end)) table.insert(playerTable[player].Connections, secondButton.MouseButton1Click:connect(function() showPlayerMenu(player, mouseDownX, secondButton.AbsolutePosition.Y + secondButton.AbsoluteSize.Y ) end)) playerObject.BackgroundTransparency = 1 playerObject.Size = UDim2.new(1,0,1,0) playerObject.Position = UDim2.new(0,0,0,0) playerObject.Parent = button playerTable[player]["MainObject" .. suffix] = button playerObject = button else playerTable[player]["MainObject" .. suffix] = playerObject end table.insert(playerTable[player].Connections, player.Changed:connect( function(prop) if prop == "MembershipType" then updatePlayerName(playerTable[player]["NameObject" .. suffix], player.MembershipType, currentColor) elseif prop == "Name" then playerTable[player]["ChangeName" .. suffix](player.Name) elseif prop == "Neutral" or prop == "TeamColor" then assignToTeam(player) end end) ) return playerObject end local function orderScrollList(scrollOrder, objectName, scrollFrame) local pos = 0 local order = {} local isTeam, isScore = getBoardTypeInfo() for i, obj in ipairs(scrollOrder) do order[obj] = 0 end if isTeam then local teams = getTeams() for i, team in ipairs(teams) do order[teamTable[team][objectName]] = pos pos = pos + 1 for i, player in ipairs(teamTable[team].Players) do if playerTable[player] then order[playerTable[player][objectName]] = pos pos = pos + 1 end end end if #teamTable["Neutral"].Players > 0 then teamTable["Neutral"][objectName].Parent = scrollFrame order[teamTable["Neutral"][objectName]] = pos pos = pos + 1 for i, player in ipairs(teamTable["Neutral"].Players) do order[playerTable[player][objectName]] = pos pos = pos + 1 end else teamTable["Neutral"][objectName].Parent = nil end else local players = getPlayers() for i, player in ipairs(players) do order[playerTable[player][objectName]] = pos pos = pos + 1 end end table.sort(scrollOrder, function(a,b) return order[a] < order[b] end) end local function createPlayerListBasics(frame, isBig) local headerFrame = Instance.new("Frame") headerFrame.Name = "Header" headerFrame.BackgroundTransparency = 1 headerFrame.Size = UDim2.new(1,-13,0,26) headerFrame.Position = UDim2.new(0,0,0,0) headerFrame.Parent = frame local lowerPaneFrame = Instance.new("Frame") lowerPaneFrame.Name = "ScrollingArea" lowerPaneFrame.BackgroundTransparency = 1 lowerPaneFrame.Size = UDim2.new(1,-3,1,-26) lowerPaneFrame.Position = UDim2.new(0,0,0,26) lowerPaneFrame.Parent = frame local scrollOrder = {} local scrollFrame, scrollUp, scrollDown, recalculateScroll = RbxGui.CreateScrollingFrame(scrollOrder) local scrollBar = Instance.new("Frame") scrollBar.Name = "ScrollBar" scrollBar.BackgroundTransparency = 0.9 scrollBar.BackgroundColor3 = Color3.new(1,1,1) scrollBar.BorderSizePixel = 0 scrollBar.Size = UDim2.new(0, 17, 1, -36) if isBig then scrollBar.Size = UDim2.new(0, 17, 1, -61) end scrollBar.Parent = lowerPaneFrame scrollFrame.Parent = lowerPaneFrame scrollUp.Parent = lowerPaneFrame scrollDown.Parent = lowerPaneFrame if isBig then scrollFrame.Position = UDim2.new(0,0,0,0) scrollUp.Position = UDim2.new(1,-41,0,5) scrollDown.Position = UDim2.new(1,-41,1,-35) scrollBar.Position = UDim2.new(1, -41, 0, 24) scrollFrame.Size = UDim2.new(1,-48,1,0) headerFrame.Size = UDim2.new(1,-20,0,32) else scrollBar.Position = UDim2.new(1, -19, 0, 14) scrollFrame.Position = UDim2.new(0,1,0,0) scrollUp.Position = UDim2.new(1,-19,0,-5) scrollDown.Position = UDim2.new(1,-19,1,-20) lowerPaneFrame.Position = UDim2.new(0,0,0,30) local toggleScrollBar = function(visible) if visible then scrollFrame.Size = UDim2.new(1,-16,1,0) headerFrame.Size = UDim2.new(1,-16,0,32) else scrollFrame.Size = UDim2.new(1,0,1,0) headerFrame.Size = UDim2.new(1,5,0,32) end scrollUp.Visible = visible scrollDown.Visible = visible scrollBar.Visible = visible end scrollUp.Changed:connect(function(prop) if prop == "Active" then toggleScrollBar(scrollUp.Active or scrollDown.Active) end end) scrollDown.Changed:connect(function(prop) if prop == "Active" then toggleScrollBar(scrollUp.Active or scrollDown.Active) end end) toggleScrollBar(scrollUp.Active or scrollDown.Active) end return headerFrame, scrollFrame, recalculateScroll, scrollOrder end createBoardsFunction = function (boardType, numStatColumns) print("Create Boards") local smallFrame = Instance.new("Frame") smallFrame.Name = "SmallPlayerlist" smallFrame.Position = smallWindowPosition smallFrame.Active = false smallFrame.Size = smallWindowSize smallFrame.BackgroundColor3 = Color3.new(0,0,0) smallFrame.BackgroundTransparency = 0.7 smallFrame.BorderSizePixel = 0 local bigFrame = Instance.new("Frame") bigFrame.Name = "BigPlayerlist" bigFrame.Size = bigWindowSize bigFrame.Position = bigWindowPosition bigFrame.BackgroundColor3 = Color3.new(0,0,0) bigFrame.BackgroundTransparency = 0.7 bigFrame.BorderSizePixel = 0 bigFrame.Visible = false local bigFrameWrapper = Instance.new("Frame") bigFrameWrapper.Name = "Expander" bigFrameWrapper.Size = UDim2.new(1,21,1,16) bigFrameWrapper.Position = UDim2.new(0, 0, 0,0) bigFrameWrapper.BackgroundTransparency = 1 bigFrameWrapper.Parent = bigFrame local smallHeaderFrame, scrollFrameSmall, recalculateScrollSmall, scrollOrderSmall = createPlayerListBasics(smallFrame, false) local bigHeaderFrame, scrollFrameBig, recalculateScrollBig, scrollOrderBig = createPlayerListBasics(bigFrameWrapper, true) local function fixPlayerlistSize(size) local newSize = size if newSize >= 16 then newSize = 16 end smallFrame.Size = UDim2.new(1,1,0,31 + (newSize * 20)) end scrollFrameSmall.ChildAdded:connect(function() fixPlayerlistSize(#scrollFrameSmall:GetChildren()) end) scrollFrameSmall.ChildRemoved:connect(function() fixPlayerlistSize(#scrollFrameSmall:GetChildren()) end) local playerListButton = Instance.new("ImageButton") playerListButton.Name = "GoBigButton" playerListButton.BackgroundTransparency = 1 playerListButton.Image = "rbxasset://textures/ui/playerlist_small_maximize.png" playerListButton.Size = UDim2.new(0.0, 35, 0, 29) playerListButton.Position = UDim2.new(0, 0, 0, 0) playerListButton.MouseButton1Click:connect( function() toggleBigWindow() end) playerListButton.Parent = smallHeaderFrame playerListButton = Instance.new("ImageButton") playerListButton.Name = "CloseButton" playerListButton.BackgroundTransparency = 1 playerListButton.Image = "rbxasset://textures/ui/playerlist_small_hide.png" playerListButton.Size = UDim2.new(0.0, 38, 0, 29) playerListButton.Position = UDim2.new(0, 35, 0, 0) playerListButton.MouseButton1Click:connect( function() transitionWindowsFunction("None") end) playerListButton.Parent = smallHeaderFrame playerListButton = Instance.new("ImageButton") playerListButton.Name = "CloseButton" playerListButton.Image = "rbxasset://textures/ui/playerlist_big_hide.png" playerListButton.BackgroundTransparency = 1 playerListButton.Size = UDim2.new(0.0, 29, 0, 29) playerListButton.Position = UDim2.new(1, -30, 0.5, -15) playerListButton.MouseButton1Click:connect( function() toggleBigWindow() end) playerListButton.Parent = bigHeaderFrame local placeName = Instance.new("TextLabel") placeName.Name = "PlaceName" placeName.Text = " Player List" placeName.FontSize = Enum.FontSize.Size24 placeName.TextXAlignment = Enum.TextXAlignment.Left placeName.Font = Enum.Font.ArialBold placeName.BackgroundTransparency = 1 placeName.TextColor3 = Color3.new(1,1,1) placeName.Size = UDim2.new(0.5, 0, 1, 0) placeName.Position = UDim2.new(0, 0, 0.0, 0) placeName = RbxGui.AutoTruncateTextObject(placeName) placeName.Parent = bigHeaderFrame currentBoardType = boardType currentStatCount = numStatColumns local isTeam, isScore = getBoardTypeInfo() local players = getPlayers() if isScore then local statColumns = getStatColumns(players) numStatColumns = #statColumns if numStatColumns > 3 then numStatColumns = 3 end createStatHeaders(statColumns, numStatColumns, false).Parent = smallHeaderFrame createStatHeaders(statColumns, currentStatCount, true).Parent = bigHeaderFrame end resetPlayerTable() for i, player in ipairs(players) do local playerObject = buildPlayerObject(player, numStatColumns, "Small") table.insert(scrollOrderSmall, playerObject) playerObject.Parent = scrollFrameSmall playerObject = buildPlayerObject(player, currentStatCount, "Big") table.insert(scrollOrderBig, playerObject) playerObject.Parent = scrollFrameBig end resetTeamTable() local teamStatObjects = {} if isTeam then local teams = getTeams() local i = #teams while i >= 1 do local team = teams[i] teamColorTable[team.TeamColor.Name] = team i = i - 1 end for i, team in ipairs(teams) do local teamObject = buildTeamObject(team, numStatColumns, "Small") table.insert(scrollOrderSmall, teamObject) teamObject.Parent = scrollFrameSmall teamObject = buildTeamObject(team, currentStatCount, "Big") table.insert(scrollOrderBig, teamObject) teamObject.Parent = scrollFrameBig end teamTable["Neutral"] = {} teamTable["Neutral"].Players = {} local neutralTeamObject = createTeamName("Neutral", BrickColor.palette(8)) teamTable["Neutral"].NameObjectSmall = neutralTeamObject teamTable["Neutral"].StatObjectSmall = nil teamTable["Neutral"].MainObjectSmall = neutralTeamObject table.insert(scrollOrderSmall, neutralTeamObject) neutralTeamObject = createTeamName("Neutral", BrickColor.palette(8)) teamTable["Neutral"].NameObjectBig = neutralTeamObject teamTable["Neutral"].StatObjectBig = nil teamTable["Neutral"].MainObjectBig = neutralTeamObject table.insert(scrollOrderBig, neutralTeamObject) local neutralPlayers = {} for i, player in ipairs(players) do assignToTeam(player) end end removePlayerFunction = function(player) if playerTable[player] then ArrayRemove(scrollOrderSmall, playerTable[player].MainObjectSmall) ArrayRemove(scrollOrderBig, playerTable[player].MainObjectBig) clearTableEntry(player, playerTable[player]) playerTable[player] = nil end end recreatePlayerFunction = function(player) removePlayerFunction(player) local playerObject = buildPlayerObject(player, numStatColumns, "Small") table.insert(scrollOrderSmall, playerObject) robloxLock(playerObject) playerObject.Parent = scrollFrameSmall playerObject = buildPlayerObject(player, currentStatCount, "Big") table.insert(scrollOrderBig, playerObject) robloxLock(playerObject) playerObject.Parent = scrollFrameBig local isTeam, isScore = getBoardTypeInfo() if isTeam then assignToTeam(player) end sortPlayerListsFunction() end sortPlayerListsFunction = function() orderScrollList(scrollOrderSmall, "MainObjectSmall", scrollFrameSmall) recalculateScrollSmall() createAlternatingRows(scrollOrderSmall) orderScrollList(scrollOrderBig, "MainObjectBig", scrollFrameBig) recalculateScrollBig() createAlternatingRows(scrollOrderBig) end sortPlayerListsFunction() robloxLock(smallFrame) robloxLock(bigFrame) return smallFrame, bigFrame end local function teamsChanged() if debounceTeamsChanged then return end debounceTeamsChanged = true wait() rebuildBoard(PlayerlistScreenGui, determineBoardType()) debounceTeamsChanged = false end local checkIfBoardChanged = function() local newBoardType, numStats = determineBoardType() if newBoardType ~= currentBoardType or numStats ~= currentStatCount then rebuildBoard(PlayerlistScreenGui, newBoardType, numStats) end end local function buildPlayerList() waitForChild(game, "Players") waitForProperty(game.Players, "LocalPlayer") playerListEnabled = true if not playerListEnabled then return end supportFriends = false local teams = game:GetService("Teams") if teams then local teamConnections = {} teams.ChildAdded:connect( function(child) if child:IsA("Team") then teamsChanged() teamConnections[child] = child.Changed:connect( function(prop) if prop == "TeamColor" or prop == "Name" then teamsChanged() end end) end end) teams.ChildRemoved:connect( function(child) if child:IsA("Team") then if teamConnections[child] then teamConnections[child]:disconnect() teamConnections[child] = nil end teamsChanged() end end) end game.Players.ChildAdded:connect( function(player) if player:IsA("Player") then addPlayerFunction(player) end end) game.Players.ChildRemoved:connect( function(player) if player:IsA("Player") then if removePlayerFunction then removePlayerFunction(player) end end end) rebuildBoard(PlayerlistScreenGui, determineBoardType()) delay(0, function() while true do wait(5) checkIfBoardChanged() end end) end buildPlayerList() transitionWindowsFunction("Small") end