diff --git a/aftman.toml b/aftman.toml index db43c9e..7b0e828 100644 --- a/aftman.toml +++ b/aftman.toml @@ -1,3 +1,3 @@ [tools] darklua = "seaofvoices/darklua@0.9.0" -yue = "pigpigyyy/Yuescript@0.16.6" +yue = "pigpigyyy/Yuescript@0.17.5" diff --git a/yue/48488235.yue b/yue/48488235.yue index 40fed5c..e74884a 100644 --- a/yue/48488235.yue +++ b/yue/48488235.yue @@ -8,6 +8,7 @@ $load $FILE -------------------- --[[ ADMINS = +{ aceswayuphigh: 1 adamintygum: 1 afackler11: 1 @@ -119,9 +120,9 @@ $load $FILE yumyumcheerios: 1 zeuxcg: 1 zodiaczak: 1 - ['erik.cassel']: 1 - ['david.baszucki']: 1 - ['matt dusek']: 1 + ['erik.cassel'] = 1, + ['david.baszucki'] = 1, + ['matt dusek'] = 1, } --]] ADMINS = @@ -154,6 +155,9 @@ Images = BASE_TWEEN = 0.25 MOUSE_DRAG_DISTANCE = 15 +local MakeBackgroundGuiObj, Color3I, getMembershipTypeIcon, \ + getFriendStatusIcon, MakePopupButton, WaitForChild, debugprint + -- Heliodex's basic New function (basically a simplified version of melt) New = (className, name, props) -> if props == nil -- no name was provided @@ -188,24 +192,26 @@ MakeBackgroundGuiObj = (imgName) -> New "ImageLabel", "Background" BackgroundTransparency: 1 Image: imgName - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 + Position: UDim2.new(0, 0, 0, 0) + Size: UDim2.new(1, 0, 1, 0) --[[ turns 255 integer color value to a color3 --]] -Color3I = (r, g, b) -> Color3.new r / 255, g / 255, b / 255 +Color3I = (r, g, b) -> + Color3.new r / 255, g / 255, b / 255 + --[[ Gets correct icon for builder's club status to display by name @Args: - membershipType Enum of membership status + membershipType Enum of membership status @Return: string of image asset --]] getMembershipTypeIcon = (membershipType, playerName) -> - if ADMINS[string.lower playerName]? - if ADMINS[string.lower playerName] == 1 + if ADMINS[string.lower(playerName)] ~= nil + if ADMINS[string.lower(playerName)] == 1 "http://banland.xyz/asset/?id=6923330951" else - ADMINS[string.lower playerName] + ADMINS[string.lower(playerName)] elseif membershipType == Enum.MembershipType.None "" @@ -214,7 +220,7 @@ getMembershipTypeIcon = (membershipType, playerName) -> elseif membershipType == Enum.MembershipType.TurboBuildersClub "rbxasset://textures/ui/TinyTbcIcon.png" elseif membershipType == Enum.MembershipType.OutrageousBuildersClub - "rbxasset://textures/ui/TinyObcIcon.png" + "rbxasset://textures/ui/TinyObcIcon.png" else error "Unknown membershipType #{membershipType}" @@ -223,7 +229,7 @@ getFriendStatusIcon = (friendStatus) -> if friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend "" elseif friendStatus == Enum.FriendStatus.Friend - "http://banland.xyz/asset/?id=99749771" + "http://banland.xyz/asset/?id=99749771" elseif friendStatus == Enum.FriendStatus.FriendRequestSent "http://banland.xyz/asset/?id=99776888" elseif friendStatus == Enum.FriendStatus.FriendRequestReceived @@ -231,6 +237,7 @@ getFriendStatusIcon = (friendStatus) -> else error "Unknown FriendStatus: #{friendStatus}" + --[[ Utility function to create buttons for the popup menus @Args: @@ -241,49 +248,40 @@ getFriendStatusIcon = (friendStatus) -> @Return: a popup menu button --]] MakePopupButton = (nparent, ntext, index, last) -> - tobj = New "ImageButton", "ReportButton", + tobj = New "ImageButton", "ReportButton" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 1 * index, 0 - Size: UDim2.new 1, 0, 1, 0 + Position: UDim2.new(0, 0, 1 * index, 0) + Size: UDim2.new(1, 0, 1, 0) ZIndex: 7 Parent: nparent - * New "TextLabel", "ButtonText", + * New "TextLabel", "ButtonText" BackgroundTransparency: 1 - Position: UDim2.new 0.07, 0, 0.07, 0 - Size: UDim2.new 0.86, 0, 0.86, 0 + Position: UDim2.new(0.07, 0, 0.07, 0) + Size: UDim2.new(0.86, 0, 0.86, 0) Font: "ArialBold" Text: ntext FontSize: "Size14" TextScaled: true - TextColor3: Color3.new 1, 1, 1 + TextColor3: Color3.new(1, 1, 1) TextStrokeTransparency: 1 ZIndex: 7 - tobj.Image = "http://banland.xyz/asset/?id=" .. if index == 0 - "97108784" + if index == 0 + tobj.Image = "http://banland.xyz/asset/?id=97108784" elseif last if index % 2 == 1 - Images["LightPopupBottom"] + tobj.Image = "http://banland.xyz/asset/?id=" .. Images["LightPopupBottom"] else - Images["DarkPopupBottom"] + tobj.Image = "http://banland.xyz/asset/?id=" .. Images["DarkPopupBottom"] + else if index % 2 == 1 - "97112126" + tobj.Image = "http://banland.xyz/asset/?id=97112126" else - "97109338" + tobj.Image = "http://banland.xyz/asset/?id=97109338" - tobj - ---[[ - simple function to toggle the display of debug output ---]] -local debugOutput -DebugPrintEnabled = true -debugprint = (str) -> - --print str - if DebugPrintEnabled - debugOutput.Text = str + return tobj --[[ obligatory wait for child function @@ -295,9 +293,10 @@ debugprint = (str) -> WaitForChild = (parent, child) -> while not parent\FindFirstChild child wait! - debugprint " child #{parent.Name} waiting for #{child}" + debugprint " child " .. parent.Name .. " waiting for " .. child + + return parent[child] - parent[child] --------------------------- -- Workspace Objects @@ -314,29 +313,31 @@ LocalPlayer = Players.LocalPlayer Mouse = LocalPlayer\GetMouse! ScreenGui = New "Frame", "PlayerListScreen" - Size: UDim2.new 1, 0, 1, 0 + Size: UDim2.new(1, 0, 1, 0) BackgroundTransparency: 1 Parent: script.Parent MainFrame = New "Frame", "LeaderBoardFrame" - Position: UDim2.new 1, -150, 0.005, 0 - Size: UDim2.new 0, 150, 0, 800 + Position: UDim2.new(1, -150, 0.005, 0) + Size: UDim2.new(0, 150, 0, 800) BackgroundTransparency: 1 Parent: ScreenGui + --frame used for expanding leaderstats when frame is 'focused' FocusFrame = New "Frame", "FocusFrame" - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0, 100 + Position: UDim2.new(0, 0, 0, 0) + Size: UDim2.new(1, 0, 0, 100) BackgroundTransparency: 1 Active: true Parent: MainFrame + -- HEADER HeaderFrame = New "Frame", "Header" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0.07, 0 + Position: UDim2.new(0, 0, 0, 0) + Size: UDim2.new(1, 0, 0.07, 0) Parent: MainFrame * MakeBackgroundGuiObj "http://banland.xyz/asset/?id=94692054" @@ -345,53 +346,51 @@ HeaderFrameHeight = HeaderFrame.Size.Y.Scale MaximizeButton = New "ImageButton", "MaximizeButton" Active: true BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 + Position: UDim2.new(0, 0, 0, 0) + Size: UDim2.new(1, 0, 1, 0) Parent: HeaderFrame HeaderName = New "TextLabel", "PlayerName" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.01, 0 - Size: UDim2.new 0.98, 0, 0.38, 0 + Position: UDim2.new(0, 0, 0.01, 0) + Size: UDim2.new(0.98, 0, 0.38, 0) Parent: HeaderFrame Font: "ArialBold" Text: LocalPlayer.Name FontSize: "Size24" - --TextScaled: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeColor3: Color3.new 0, 0, 0 + --TextScaled = true, + TextColor3: Color3.new(1, 1, 1) + TextStrokeColor3: Color3.new(0, 0, 0) TextStrokeTransparency: 0 TextXAlignment: "Right" TextYAlignment: "Center" HeaderScore = New "TextLabel", "PlayerScore" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.4, 0 - Size: UDim2.new 0.98, 0, 0, 30 + Position: UDim2.new(0, 0, 0.4, 0) + Size: UDim2.new(0.98, 0, 0, 30) Parent: HeaderFrame Font: "ArialBold" Text: "" FontSize: "Size24" TextYAlignment: "Top" - -- TextScaled: true - TextColor3: Color3.new 1, 1, 1 + --TextScaled = true, + TextColor3: Color3.new(1, 1, 1) TextStrokeTransparency: 1 TextXAlignment: "Right" -HeaderFrameHeight = HeaderFrame.Size.Y.Scale - -- BOTTOM --used for shifting bottom frame for mouse over effects BottomShiftFrame = New "Frame", "BottomShiftFrame" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, HeaderFrameHeight, 0 - Size: UDim2.new 1, 0, 1, 0 + Position: UDim2.new(0, 0, HeaderFrameHeight, 0) + Size: UDim2.new(1, 0, 1, 0) Parent: MainFrame BottomFrame = New "Frame", "Bottom" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.07, 0 - Size: UDim2.new 1, 0, 0.03, 0 + Position: UDim2.new(0, 0, 0.07, 0) + Size: UDim2.new(1, 0, 0.03, 0) Parent: BottomShiftFrame * MakeBackgroundGuiObj "http://banland.xyz/asset/?id=94754966" @@ -399,8 +398,8 @@ BottomFrame = New "Frame", "Bottom" ExtendButton = New "ImageButton", "bigbutton" Active: true BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1.5, 0 + Position: UDim2.new(0, 0, 0, 0) + Size: UDim2.new(1, 0, 1.5, 0) ZIndex: 3 Parent: BottomFrame @@ -408,49 +407,49 @@ ExtendTab = New "ImageButton", "extendTab" Active: true BackgroundTransparency: 1 Image: "http://banland.xyz/asset/?id=94692731" - Position: UDim2.new 0.608, 0, 0.3, 0 - Size: UDim2.new 0.3, 0, 0.7, 0 + Position: UDim2.new(0.608, 0, 0.3, 0) + Size: UDim2.new(0.3, 0, 0.7, 0) Parent: BottomFrame TopClipFrame = New "Frame", "ListFrame" BackgroundTransparency: 1 - Position: UDim2.new -1, 0, 0.07, 0 - Size: UDim2.new 2, 0, 1, 0 + Position: UDim2.new(-1, 0, 0.07, 0) + Size: UDim2.new(2, 0, 1, 0) Parent: MainFrame ClipsDescendants: true BottomClipFrame = New "Frame", "BottomFrame" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, -0.8, 0 - Size: UDim2.new 1, 0, 1, 0 + Position: UDim2.new(0, 0, -0.8, 0) + Size: UDim2.new(1, 0, 1, 0) Parent: TopClipFrame ClipsDescendants: true ScrollBarFrame = New "Frame", "ScrollBarFrame" BackgroundTransparency: 1 - Position: UDim2.new 0.987, 0, 0.8, 0 - Size: UDim2.new 0.01, 0, 0.2, 0 + Position: UDim2.new(0.987, 0, 0.8, 0) + Size: UDim2.new(0.01, 0, 0.2, 0) Parent: BottomClipFrame ScrollBar = New "Frame", "ScrollBar" BackgroundTransparency: 0 - BackgroundColor3: Color3.new 0.2, 0.2, 0.2 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0.5, 0 + BackgroundColor3: Color3.new(0.2, 0.2, 0.2) + Position: UDim2.new(0, 0, 0, 0) + Size: UDim2.new(1, 0, 0.5, 0) ZIndex: 5 Parent: ScrollBarFrame ListFrame = New "Frame", "SubFrame" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.8, 0 - Size: UDim2.new 1, 0, 1, 0 + Position: UDim2.new(0, 0, 0.8, 0) + Size: UDim2.new(1, 0, 1, 0) Parent: BottomClipFrame -PopUpClipFrame = New "Frame", "PopUpFrame", +PopUpClipFrame = New "Frame", "PopUpFrame" BackgroundTransparency: 1 SizeConstraint: "RelativeXX" - Position: MainFrame.Position + UDim2.new 0, -150, 0, 0 - Size: UDim2.new 0, 150, 0, 800 + Position: MainFrame.Position + UDim2.new(0, -150, 0, 0) + Size: UDim2.new(0, 150, 0, 800) Parent: MainFrame ClipsDescendants: true ZIndex: 7 @@ -458,16 +457,18 @@ PopUpClipFrame = New "Frame", "PopUpFrame", PopUpPanel = nil PopUpPanelTemplate = New "Frame", "Panel" BackgroundTransparency: 1 - Position: UDim2.new 1, 0, 0, 0 - Size: UDim2.new 1, 0, 0.032, 0 + Position: UDim2.new(1, 0, 0, 0) + Size: UDim2.new(1, 0, 0.032, 0) Parent: PopUpClipFrame -StatTitles = New "Frame", "StatTitles", + +StatTitles = New "Frame", "StatTitles" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 1, -10 - Size: UDim2.new 1, 0, 0, 0 + Position: UDim2.new(0, 0, 1, -10) + Size: UDim2.new(1, 0, 0, 0) Parent: HeaderFrame + IsMinimized = Instance.new "BoolValue" IsMaximized = Instance.new "BoolValue" IsTabified = Instance.new "BoolValue" @@ -475,14 +476,14 @@ AreNamesExpanded = Instance.new "BoolValue" MiddleTemplate = New "Frame", "MidTemplate" BackgroundTransparency: 1 - Position: UDim2.new 100, 0, 0.07, 0 - Size: UDim2.new 0.5, 0, 0.025, 0 --UDim2.new 1, 0, .03, 0 + Position: UDim2.new(100, 0, 0.07, 0) + Size: UDim2.new(0.5, 0, 0.025, 0), --UDim2.new(1, 0, .03, 0) * New "ImageLabel", "BCLabel" Active: true BackgroundTransparency: 1 - Position: UDim2.new 0.005, 5, 0.20, 0 - Size: UDim2.new 0, 16, 0, 16 + Position: UDim2.new(0.005, 5, 0.20, 0) + Size: UDim2.new(0, 16, 0, 16) SizeConstraint: "RelativeYY" Image: "" ZIndex: 3 @@ -490,8 +491,8 @@ MiddleTemplate = New "Frame", "MidTemplate" * New "ImageLabel", "FriendLabel" Active: true BackgroundTransparency: 1 - Position: UDim2.new 0.005, 5, 0.15, 0 - Size: UDim2.new 0, 16, 0, 16 + Position: UDim2.new(0.005, 5, 0.15, 0) + Size: UDim2.new(0, 16, 0, 16) SizeConstraint: "RelativeYY" Image: "" ZIndex: 3 @@ -499,51 +500,52 @@ MiddleTemplate = New "Frame", "MidTemplate" * New "ImageButton", "ClickListener" Active: true BackgroundTransparency: 1 - Position: UDim2.new 0.005, 1, 0, 0 - Size: UDim2.new 0.96, 0, 1, 0 + Position: UDim2.new(0.005, 1, 0, 0) + Size: UDim2.new(0.96, 0, 1, 0) ZIndex: 3 * New "Frame", "TitleFrame" BackgroundTransparency: 1 - Position: UDim2.new 0.01, 0, 0, 0 - Size: UDim2.new 0, 140, 1, 0 + Position: UDim2.new(0.01, 0, 0, 0) + Size: UDim2.new(0, 140, 1, 0) ClipsDescendants: true - * New "TextLabel", "Title" BackgroundTransparency: 1 - Position: UDim2.new 0, 5, 0, 0 - Size: UDim2.new 100, 0, 1, 0 + Position: UDim2.new(0, 5, 0, 0) + Size: UDim2.new(100, 0, 1, 0) Font: "Arial" FontSize: "Size14" - TextColor3: Color3.new 1, 1, 1 + TextColor3: Color3.new(1, 1, 1) TextXAlignment: "Left" TextYAlignment: "Center" ZIndex: 3 - * New "TextLabel", "PlayerScore", + + * New "TextLabel", "PlayerScore" BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 + Position: UDim2.new(0, 0, 0, 0) + Size: UDim2.new(1, 0, 1, 0) Font: "ArialBold" Text: "" FontSize: "Size14" - TextColor3: Color3.new 1, 1, 1 + TextColor3: Color3.new(1, 1, 1) TextXAlignment: "Right" TextYAlignment: "Center" ZIndex: 3 - --New'IntValue'{Name = 'ID'}, - --New'ObjectValue'{Name = 'Player'}, - --New'IntValue'{Name = 'Score'}, - ZIndex: 3, + --Create'IntValue'{Name = 'ID'}, + --Create'ObjectValue'{Name = 'Player'}, + --Create'IntValue'{Name = 'Score'}, + ZIndex: 3 MiddleBGTemplate = New "Frame", "MidBGTemplate" BackgroundTransparency: 1 Position: UDim2.new 100, 0, 0.07, 0 - Size: UDim2.new 0.5, 0, 0.025, 0 --UDim2.new 1, 0, .03, 0 + Size: UDim2.new 0.5, 0, 0.025, 0 --UDim2.new(1, 0, .03, 0) * MakeBackgroundGuiObj "http://banland.xyz/asset/?id=94692025" + -- REPORT ABUSE OBJECTS ReportAbuseShield = New "TextButton", "ReportAbuseShield" @@ -551,39 +553,37 @@ ReportAbuseShield = New "TextButton", "ReportAbuseShield" AutoButtonColor: false Active: true Visible: true - Size: UDim2.new 1, 0, 1, 0 - BackgroundColor3: Color3I 51, 51, 51 - BorderColor3: Color3I 27, 42, 53 + Size: UDim2.new(1, 0, 1, 0) + BackgroundColor3: Color3I(51, 51, 51) + BorderColor3: Color3I(27, 42, 53) BackgroundTransparency: 1 ReportAbuseFrame = New "Frame", "Settings" - Position: UDim2.new 0.5, -250, 0.5, -200 - Size: UDim2.new 0, 500, 0, 400 + Position: UDim2.new(0.5, -250, 0.5, -200) + Size: UDim2.new(0, 500, 0, 400) BackgroundTransparency: 1 Active: true Parent: ReportAbuseShield -local AbuseSettingsFrame AbuseSettingsFrame = New "Frame", "ReportAbuseStyle" - Size: UDim2.new 1, 0, 1, 0 + Size: UDim2.new(1, 0, 1, 0) Active: true BackgroundTransparency: 1 - Parent: ReportAbuseFrame * MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96488767" -- 96480351" * New "TextLabel", "Title" Text: "Report Abuse" - TextColor3: Color3I 221, 221, 221 - Position: UDim2.new 0.5, 0, 0, 30 + TextColor3: Color3I(221, 221, 221) + Position: UDim2.new(0.5, 0, 0, 30) Font: Enum.Font.ArialBold FontSize: Enum.FontSize.Size36 * New "TextLabel", "Description" - Text: "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action." - TextColor3: Color3I 221, 221, 221 - Position: UDim2.new 0.01, 0, 0, 55 - Size: UDim2.new 0.99, 0, 0, 40 + Text: "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action." + TextColor3: Color3I(221, 221, 221) + Position: UDim2.new(0.01, 0, 0, 55) + Size: UDim2.new(0.99, 0, 0, 40) BackgroundTransparency: 1 Font: Enum.Font.Arial FontSize: Enum.FontSize.Size18 @@ -596,18 +596,18 @@ AbuseSettingsFrame = New "Frame", "ReportAbuseStyle" Font: Enum.Font.Arial BackgroundTransparency: 1 FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 140 - Size: UDim2.new 0.4, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 + Position: UDim2.new(0.025, 0, 0, 140) + Size: UDim2.new(0.4, 0, 0, 36) + TextColor3: Color3I(255, 255, 255) TextXAlignment: Enum.TextXAlignment.Left * New "TextLabel", "ShortDescriptionLabel" Text: "Short Description: (optional)" Font: Enum.Font.Arial FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 180 - Size: UDim2.new 0.95, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 + Position: UDim2.new(0.025, 0, 0, 180) + Size: UDim2.new(0.95, 0, 0, 36) + TextColor3: Color3I(255, 255, 255) TextXAlignment: Enum.TextXAlignment.Left BackgroundTransparency: 1 @@ -616,187 +616,203 @@ AbuseSettingsFrame = New "Frame", "ReportAbuseStyle" BackgroundTransparency: 1 Font: Enum.Font.Arial FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 100 - Size: UDim2.new 0.95, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 + Position: UDim2.new(0.025, 0, 0, 100) + Size: UDim2.new(0.95, 0, 0, 36) + TextColor3: Color3I(255, 255, 255) TextXAlignment: Enum.TextXAlignment.Left - Parent: AbuseSettingsFrame + + + Parent: ReportAbuseFrame AbusePlayerLabel = New "TextLabel", "PlayerLabel" Text: "" BackgroundTransparency: 1 Font: Enum.Font.ArialBold FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 100 - Size: UDim2.new 0.95, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 + Position: UDim2.new(0.025, 0, 0, 100) + Size: UDim2.new(0.95, 0, 0, 36) + TextColor3: Color3I(255, 255, 255) TextXAlignment: Enum.TextXAlignment.Right Parent: AbuseSettingsFrame + SubmitReportButton = New "ImageButton", "SubmitReportBtn" Active: false BackgroundTransparency: 1 - Position: UDim2.new 0.5, -200, 1, -80 - Size: UDim2.new 0, 150, 0, 50 + Position: UDim2.new(0.5, -200, 1, -80) + Size: UDim2.new(0, 150, 0, 50) AutoButtonColor: false - Image: "http://banland.xyz/asset/?id=96502438" -- 96501119' + Image: "http://banland.xyz/asset/?id=96502438", -- 96501119" Parent: AbuseSettingsFrame + CancelReportButton = New "ImageButton", "CancelBtn" BackgroundTransparency: 1 - Position: UDim2.new 0.5, 50, 1, -80 - Size: UDim2.new 0, 150, 0, 50 + Position: UDim2.new(0.5, 50, 1, -80) + Size: UDim2.new(0, 150, 0, 50) AutoButtonColor: true Image: "http://banland.xyz/asset/?id=96500683" Parent: AbuseSettingsFrame + AbuseDescriptionWrapper = New "Frame", "AbuseDescriptionWrapper" - Position: UDim2.new 0.025, 0, 0, 220 - Size: UDim2.new 0.95, 0, 1, -310 - BackgroundColor3: Color3I 0, 0, 0 + Position: UDim2.new(0.025, 0, 0, 220) + Size: UDim2.new(0.95, 0, 1, -310) + BackgroundColor3: Color3I(0, 0, 0) BorderSizePixel: 0 Parent: AbuseSettingsFrame + local AbuseDescriptionBox -OriginalAbuseDescriptionBox = New "TextBox" +OriginalAbuseDescriptionBox = New "TextBox", "TextBox" Text: "" ClearTextOnFocus: false Font: Enum.Font.Arial FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, 3, 0, 3 - Size: UDim2.new 1, -6, 1, -6 - TextColor3: Color3I 255, 255, 255 + Position: UDim2.new(0, 3, 0, 3) + Size: UDim2.new(1, -6, 1, -6) + TextColor3: Color3I(255, 255, 255) TextXAlignment: Enum.TextXAlignment.Left TextYAlignment: Enum.TextYAlignment.Top TextWrap: true - BackgroundColor3: Color3I 0, 0, 0 + BackgroundColor3: Color3I(0, 0, 0) BorderSizePixel: 0 + CalmingAbuseBox = New "Frame", "AbuseFeedbackBox" BackgroundTransparency: 1 - Position: UDim2.new 0.25, 0, 0.3, 0 - Size: UDim2.new 0.5, 0, 0.37, 0 + Position: UDim2.new(0.25, 0, 0.300000012, 0) + Size: UDim2.new(0.5, 0, 0.370000005, 0) * MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96506233" - * New "TextLabel", "Header", - Position: UDim2.new 0, 10, 0.05, 0 - Size: UDim2.new 1, -30, 0.15, 0 + * New "TextLabel", "Header" + Position: UDim2.new(0, 10, 0.05, 0) + Size: UDim2.new(1, -30, 0.15, 0) TextScaled: true BackgroundTransparency: 1 TextXAlignment: Enum.TextXAlignment.Center TextYAlignment: Enum.TextYAlignment.Top Text: "Thanks for your report!" - TextColor3: Color3.new 1, 1, 1 + TextColor3: Color3.new(1, 1, 1) FontSize: Enum.FontSize.Size48 Font: "ArialBold" * New "TextLabel", "content" - Position: UDim2.new 0, 10, 0.20, 0 - Size: UDim2.new 1, -30, 0.40, 0 + Position: UDim2.new(0, 10, 0.20, 0) + Size: UDim2.new(1, -30, 0.40, 0) TextScaled: true BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - Text: "Our moderators will review the chat logs and determine what happened. The other user is probably just trying to make you mad.\n\nIf anyone used swear words, inappropriate language, or threatened you in real life, please report them for Bad Words or Threats" + TextColor3: Color3.new(1, 1, 1) + Text: "Our moderators will review the chat logs and determine what happened. The other user is probably just trying to make you mad.\n\nIf anyone used swear words, inappropriate language, or threatened you in real life, please report them for Bad Words or Threats" TextWrapped: true TextYAlignment: Enum.TextYAlignment.Top FontSize: Enum.FontSize.Size24 Font: "Arial" * New "ImageButton", "OkButton" - BackgroundTransparency: 1, - Position: UDim2.new 0.5, -75, 1, -80, - Size: UDim2.new 0, 150, 0, 50, - AutoButtonColor: true, - Image: "http://banland.xyz/asset/?id=96507959", + BackgroundTransparency: 1 + Position: UDim2.new(0.5, -75, 1, -80) + Size: UDim2.new(0, 150, 0, 50) + AutoButtonColor: true + Image: "http://banland.xyz/asset/?id=96507959" NormalAbuseBox = New "Frame", "AbuseFeedbackBox" BackgroundTransparency: 1 - Position: UDim2.new 0.25, 0, 0.300000012, 0 - Size: UDim2.new 0.5, 0, 0.370000005, 0 + Position: UDim2.new(0.25, 0, 0.300000012, 0) + Size: UDim2.new(0.5, 0, 0.370000005, 0) * MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96506233" * New "TextLabel", "Header" - Position: UDim2.new 0, 10, 0.05, 0 - Size: UDim2.new 1, -30, 0.15, 0 + Position: UDim2.new(0, 10, 0.05, 0) + Size: UDim2.new(1, -30, 0.15, 0) TextScaled: true BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 + TextColor3: Color3.new(1, 1, 1) TextXAlignment: Enum.TextXAlignment.Center TextYAlignment: Enum.TextYAlignment.Top Text: "Thanks for your report!" FontSize: Enum.FontSize.Size48 Font: "ArialBold" - * New "TextLabel", "content", - Position: UDim2.new 0, 10, 0.20, 0 - Size: UDim2.new 1, -30, 0.15, 0 + * New "TextLabel", "content" + Position: UDim2.new(0, 10, 0.20, 0) + Size: UDim2.new(1, -30, 0.15, 0) TextScaled: true BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 + TextColor3: Color3.new(1, 1, 1) Text: "Our moderators will review the chat logs and determine what happened." TextWrapped: true TextYAlignment: Enum.TextYAlignment.Top FontSize: Enum.FontSize.Size24 Font: "Arial" - * New "ImageButton", "OkButton", + * New "ImageButton", "OkButton" BackgroundTransparency: 1 - Position: UDim2.new 0.5, -75, 1, -80 - Size: UDim2.new 0, 150, 0, 50 + Position: UDim2.new(0.5, -75, 1, -80) + Size: UDim2.new(0, 150, 0, 50) AutoButtonColor: true Image: "http://banland.xyz/asset/?id=96507959" -BigButton = New "ImageButton" - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - ZIndex: 8 - Visible: false - --Active: false - Parent: ScreenGui +BigButton = Instance.new "ImageButton" +BigButton.Size = UDim2.new 1, 0, 1, 0 +BigButton.BackgroundTransparency = 1 +BigButton.ZIndex = 8 +BigButton.Visible = false +--BigButton.Active=false +BigButton.Parent = ScreenGui debugFrame = New "Frame", "debugframe" - -- Position: UDim2.new 0, 0, 0, 0 - -- Size: UDim2.new 0, 150, 0, 800 --0.99000001 - -- BackgroundTransparency: 1 + --Position = UDim2.new(0, 0, 0, 0), + --Size = UDim2.new(0, 150, 0, 800),--0.99000001 + --BackgroundTransparency = 1, BackgroundTransparency: 1 - Position: UDim2.new 0.25, 0, 0.3, 0 - Size: UDim2.new 0.5, 0, 0.37, 0 + Position: UDim2.new(0.25, 0, 0.300000012, 0) + Size: UDim2.new(0.5, 0, 0.370000005, 0) * MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96506233" debugplayers = New "TextLabel" BackgroundTransparency: 0.8 - Position: UDim2.new 0, 0, 0.01, 0 - Size: UDim2.new 1, 0, 0.5, 0 + Position: UDim2.new(0, 0, 0.01, 0) + Size: UDim2.new(1, 0, 0.5, 0) Parent: debugFrame Font: "ArialBold" Text: "--" FontSize: "Size14" TextWrapped: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeColor3: Color3.new 0, 0, 0 + TextColor3: Color3.new(1, 1, 1) + TextStrokeColor3: Color3.new(0, 0, 0) TextStrokeTransparency: 0 TextXAlignment: "Right" TextYAlignment: "Center" debugOutput = New "TextLabel" BackgroundTransparency: 0.8 - Position: UDim2.new 0, 0, 0.5, 0 - Size: UDim2.new 1, 0, 0.5, 0 + Position: UDim2.new(0, 0, 0.5, 0) + Size: UDim2.new(1, 0, 0.5, 0) Parent: debugFrame Font: "ArialBold" Text: "--" FontSize: "Size14" TextWrapped: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeColor3: Color3.new 0, 0, 0 + TextColor3: Color3.new(1, 1, 1) + TextStrokeColor3: Color3.new(0, 0, 0) TextStrokeTransparency: 0 TextXAlignment: "Right" TextYAlignment: "Center" +--[[ + simple function to toggle the display of debug output +--]] +DebugPrintEnabled = true +debugprint = (str) -> + --print str + if DebugPrintEnabled + debugOutput.Text = str + ------------------------- -- Script objects ------------------------- @@ -806,7 +822,7 @@ RbxGui = assert LoadLibrary "RbxGui" DefaultEntriesOnScreen = 8 for _, i in pairs Images - Game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=#{i}" + Game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=" .. i -- ordered array of 'score data', each entry has: @@ -833,7 +849,7 @@ PlayerFrames = {} -- ID (int to prevent flipping out of leaderboard, fun times) TeamFrames = {} -- one special entry from teamFrames, for unaffiliated players, only shown if players non - empty -local NeutralTeam +NeutralTeam = nil -- final 'to be displayed' list of frames MiddleFrames = {} @@ -846,6 +862,7 @@ OnIos = false try OnIos = Game\GetService"UserInputService".TouchEnabled + -- you get 200 of x screen space per stat added, start width 16% BaseScreenXSize = 150 SpacingPerStat = 10 --spacing between stats @@ -862,18 +879,17 @@ RightEdgeSpace = -0.04 DefaultBottomClipPos = BottomClipFrame.Position.Y.Scale -local SelectedPlayerEntry -local SelectedPlayer +SelectedPlayerEntry = nil +SelectedPlayer = nil -- locks(semaphores) for stopping race conditions -AddingFrameLock \ -= AddingStatLock \ -= BaseUpdateLock \ -= WaitForClickLock \ -= InPopupWaitForClick \ -= PlayerChangedLock \ -= NeutralTeamLock \ -= false +AddingFrameLock = false +AddingStatLock = false +BaseUpdateLock = false +WaitForClickLock = false +InPopupWaitForClick = false +PlayerChangedLock = false +NeutralTeamLock = false ScrollWheelConnections = {} @@ -887,24 +903,25 @@ DidMinimizeDrag = false -- report abuse objects local AbuseName -Abuses = - * "Bad Words or Threats" - * "Bad Username" - * "Talking about Dating" - * "Account Trading or Sharing" - * "Asking Personal Questions" - * "Rude or Mean Behavior" - * "False Reporting Me" - +Abuses = { + "Bad Words or Threats", + "Bad Username", + "Talking about Dating", + "Account Trading or Sharing", + "Asking Personal Questions", + "Rude or Mean Behavior", + "False Reporting Me", +} local UpdateAbuseFunction local AbuseDropDown -PrivilegeLevel = +PrivilegeLevel = { Owner: 255 Admin: 240 Member: 128 Visitor: 10 Banned: 0 +} IsPersonalServer = not not game.Workspace\FindFirstChild "PSVariable" @@ -912,48 +929,74 @@ game.Workspace.ChildAdded\connect (nchild) -> if nchild.Name == "PSVariable" and nchild\IsA "BoolValue" IsPersonalServer = true +-- let's local ALL (most of) the functions +local HighlightMyRank, CloseAbuseDialog, Tabify, UnTabify, BaseUpdate, \ + UpdateHeaderNameSize, UpdateMaximize, UpdateMinimize, UpdateStatNames, \ + UpdateScrollPosition, UpdateScrollBarSize, AddPlayerToTeam, \ + AddNeutralTeam, PlayerChanged, RemovePlayerFromTeam, RemoveNeutralTeam, \ + RemoveTeamFrame, debugPlayerAdd, --[[]] AreAllEntriesOnScreen, GetMaxScroll, \ + GetMinScroll, AbsoluteToPercent, TweenProperty, WaitForClick, \ + SetPrivilegeRank, OnPrivilegeLevelSelect, OnSubmitAbuse, ClosePopUpPanel, \ + OpenAbuseDialog, InitReportAbuse, GetFriendStatus, OnFriendButtonSelect, \ + OnFriendRefuseButtonSelect, PlayerSortFunction, BlowThisPopsicleStand, \ + StatSort, StatChanged, CreateStatTitle, StatAdded, MakeScoreEntry, \ + RecreateScoreColumns, ToggleMinimize, ToggleMaximize, \ + ActivatePlayerEntryPanel, StartDrag, StartMinimizeDrag, AddMiddleBGFrame, \ + RemoveMiddleBGFrame, ChangeHeaderName, LeaderstatsAdded, \ + LeaderstatsRemoved, OnPlayerEntrySelect, PlayerListModeUpdate, \ + InsertPlayerFrame, RemovePlayerFrame, UnrollTeams, TeamSortFunc, \ + AddTeamScores, SortTeams, TeamListModeUpdate, FindRemovePlayerFromTeam, \ + SetPlayerToTeam, OnFriendshipChanged, TeamScoreChanged, TeamChildAdded, \ + TeamChildRemoved, TeamAdded, TeamRemoved, PlayersChildAdded, \ + coreGuiChanged, TeamsChildAdded, TeamsChildRemoved, TeamChanged, \ + InsertTeamFrame, InitMovingPanel, UpdateScrollBarVisibility, \ + OnScrollWheelMove, AttachScrollWheel, CloseNames, ExpandNames, \ + RemoveAllStats, GetScoreValue, StatRemoved, DoesStatExist, DetachScrollWheel +-- holy fuck i'm sorry - Heliodex + + ------------------------------- -- Static Functions ------------------------------- -- GetTotalEntries = -> -- return math.min #MiddleFrameBackgrounds, DefaultEntriesOnScreen - +-- -- GetEntryListLength = -> -- numEnts = #PlayerFrames + #TeamFrames -- if NeutralTeam -- numEnts += 1 --- numEnts - +-- -- return numEnts +-- AreAllEntriesOnScreen = -> - #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale <= 1 + DefaultBottomClipPos + return #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale <= 1 + DefaultBottomClipPos -- GetLengthOfVisbleScroll = -> --- 1 + DefaultBottomClipPos - +-- return 1 + DefaultBottomClipPos +-- GetMaxScroll = -> - DefaultBottomClipPos * -1 + return DefaultBottomClipPos * -1 -- can be optimized by caching when this varible changes GetMinScroll = -> if AreAllEntriesOnScreen! - GetMaxScroll! + return GetMaxScroll! else - (GetMaxScroll! - (#MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale)) + (1 + DefaultBottomClipPos) + return (GetMaxScroll! - (#MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale)) + (1 + DefaultBottomClipPos) AbsoluteToPercent = (x, y) -> - Vector2.new(x, y) / ScreenGui.AbsoluteSize + return Vector2.new(x, y) / ScreenGui.AbsoluteSize --[[ tweens property of element from starta to enda over length of time Warning: should be put in a Spawn call @Args: - element textobject to tween transparency on + element textobject to tween transparency on propName - starta alpha to start tweening - enda alpha to end tweening on - length how many seconds to spend tweening + starta alpha to start tweening + enda alpha to end tweening on + length how many seconds to spend tweening --]] TweenProperty = (obj, propName, inita, enda, length) -> startTime = tick! @@ -966,15 +1009,15 @@ TweenProperty = (obj, propName, inita, enda, length) -> --[[ UGLY UGLY HACK FUNCTION replace with some sort of global input catching A.S.A. FREAKING P. - creates a fullsize gui element to catch next mouse up event completeing a click + creates a fullsize gui element to catch next mouse up event (completeing a click) @Args: - frameParent Object to parent fullscreen gui to - polledFunction function to call on mouse moved events in this gui - exitFunction function to call when click event is fired + frameParent Object to parent fullscreen gui to + polledFunction function to call on mouse moved events in this gui + exitFunction function to call when click event is fired --]] - WaitForClick = (frameParent, polledFunction, exitFunction) -> - return if WaitForClickLock + if WaitForClickLock + return WaitForClickLock = true local connection, connection2 @@ -982,9 +1025,10 @@ WaitForClick = (frameParent, polledFunction, exitFunction) -> exitFunction nx, ny BigButton.Visible = false connection\disconnect! - connection2?\disconnect! + if connection2 + connection2\disconnect! - --debugprint 'mouse up!' + --debugprint "mouse up!" connection2 = BigButton.MouseMoved\connect (nx, ny) -> polledFunction nx, ny @@ -995,7 +1039,7 @@ WaitForClick = (frameParent, polledFunction, exitFunction) -> BigButton.Active = true BigButton.Parent = frameParent frameParent.AncestryChanged\connect (child, nparent) -> - if child == frameParent and not nparent? + if child == frameParent and nparent == nil exitFunction nx, ny BigButton.Visible = false connection\disconnect! @@ -1013,28 +1057,28 @@ WaitForClick = (frameParent, polledFunction, exitFunction) -> Note: these privilege levels seem completely arbitrary, but no documentation exists this is all from the old player list, really weird @Args: - rank Integer rank value for player - @Return Normalized integer value for rank? + rank Integer rank value for player + @Return Normalized integer value for rank? --]] -- GetPrivilegeType = (rank) -> -- if rank <= PrivilegeLevel["Banned"] --- PrivilegeLevel["Banned"] +-- return PrivilegeLevel["Banned"] -- elseif rank <= PrivilegeLevel["Visitor"] --- PrivilegeLevel["Visitor"] +-- return PrivilegeLevel["Visitor"] -- elseif rank <= PrivilegeLevel["Member"] --- PrivilegeLevel["Member"] +-- return PrivilegeLevel["Member"] -- elseif rank <= PrivilegeLevel["Admin"] --- PrivilegeLevel["Admin"] +-- return PrivilegeLevel["Admin"] -- else --- PrivilegeLevel["Owner"] - +-- return PrivilegeLevel["Owner"] +-- -- --[[ gives a player a new privilage rank Note: Very odd that I have to use loops with this instead of directly setting the rank but no documentation for personal server service exists @Args: - player player to change rank of - nrank new integer rank to give player + player player to change rank of + nrank new integer rank to give player --]] SetPrivilegeRank = (player, nrank) -> while player.PersonalServerRank < nrank @@ -1043,55 +1087,43 @@ SetPrivilegeRank = (player, nrank) -> while player.PersonalServerRank > nrank game\GetService"PersonalServerService"\Demote player -assetid = "http://banland.xyz/asset/?id=" ---[[ - Highlights current rank of this player in the popup menu - @Args: - player Player to check for rank on ---]] -HighlightMyRank = (player, BanPlayerButton, VisitorButton, MemberButton, AdminButton) -> - BanPlayerButton.Image = assetid .. Images["LightPopupMid"] - VisitorButton.Image = assetid .. Images["DarkPopupMid"] - MemberButton.Image = assetid .. Images["LightPopupMid"] - AdminButton.Image = assetid .. Images["DarkPopupBottom"] - - rank = player.PersonalServerRank - if rank <= PrivilegeLevel["Banned"] - BanPlayerButton.Image = assetid .. Images["LightBluePopupMid"] - elseif rank <= PrivilegeLevel["Visitor"] - VisitorButton.Image = assetid .. Images["DarkBluePopupMid"] - elseif rank <= PrivilegeLevel["Member"] - MemberButton.Image = assetid .. Images["LightBluePopupMid"] - elseif rank <= PrivilegeLevel["Admin"] - AdminButton.Image = assetid .. Images["DarkBluePopupBottom"] - --[[ called when player selects new privilege level from popup menu @Args: - player player to set privileges on - nlevel new privilege level for this player + player player to set privileges on + nlevel new privilege level for this player --]] OnPrivilegeLevelSelect = (player, nlevel, BanPlayerButton, VisitorButton, MemberButton, AdminButton) -> debugprint "setting privilege level" SetPrivilegeRank player, nlevel HighlightMyRank player, BanPlayerButton, VisitorButton, MemberButton, AdminButton + +--[[ + Highlights current rank of this player in the popup menu + @Args: + player Player to check for rank on +--]] +HighlightMyRank = (player, BanPlayerButton, VisitorButton, MemberButton, AdminButton) -> + BanPlayerButton.Image = "http://banland.xyz/asset/?id=" .. Images["LightPopupMid"] + VisitorButton.Image = "http://banland.xyz/asset/?id=" .. Images["DarkPopupMid"] + MemberButton.Image = "http://banland.xyz/asset/?id=" .. Images["LightPopupMid"] + AdminButton.Image = "http://banland.xyz/asset/?id=" .. Images["DarkPopupBottom"] + + rank = player.PersonalServerRank + if rank <= PrivilegeLevel["Banned"] + BanPlayerButton.Image = "http://banland.xyz/asset/?id=" .. Images["LightBluePopupMid"] + elseif rank <= PrivilegeLevel["Visitor"] + VisitorButton.Image = "http://banland.xyz/asset/?id=" .. Images["DarkBluePopupMid"] + elseif rank <= PrivilegeLevel["Member"] + MemberButton.Image = "http://banland.xyz/asset/?id=" .. Images["LightBluePopupMid"] + elseif rank <= PrivilegeLevel["Admin"] + AdminButton.Image = "http://banland.xyz/asset/?id=" .. Images["DarkBluePopupBottom"] + + -------------------------- -- Report abuse handling -------------------------- ---[[ - resets and closes abuse dialog ---]] -CloseAbuseDialog = -> - AbuseName = nil - SubmitReportButton.Active = false - SubmitReportButton.Image = "http://banland.xyz/asset/?id=96502438" -- 96501119' - AbuseDescriptionBox\Destroy! - CalmingAbuseBox.Parent = nil - NormalAbuseBox.Parent = nil - ReportAbuseShield.Parent = nil - AbuseSettingsFrame.Visible = true - --[[ does final reporting of abuse on selected player, calls closeAbuseDialog --]] @@ -1105,9 +1137,12 @@ OnSubmitAbuse = -> else debugprint "opening abuse box" NormalAbuseBox.Parent = ReportAbuseShield + else CloseAbuseDialog! + + ClosePopUpPanel = -> if SelectedPlayerEntry tframe = SelectedPlayerEntry["Frame"] @@ -1119,6 +1154,7 @@ ClosePopUpPanel = -> InPopupWaitForClick = false SelectedPlayerEntry = nil + --[[ opens the abuse dialog, initialises text to display selectedplayer --]] @@ -1132,6 +1168,19 @@ OpenAbuseDialog = -> ReportAbuseShield.Parent = ScreenGui ClosePopUpPanel! +--[[ + resets and closes abuse dialog +--]] +CloseAbuseDialog = -> + AbuseName = nil + SubmitReportButton.Active = false + SubmitReportButton.Image = "http://banland.xyz/asset/?id=96502438" -- 96501119', + AbuseDescriptionBox\Destroy! + CalmingAbuseBox.Parent = nil + NormalAbuseBox.Parent = nil + ReportAbuseShield.Parent = nil + AbuseSettingsFrame.Visible = true + --[[ creates dropdownbox, registers all listeners for abuse dialog @@ -1143,6 +1192,7 @@ InitReportAbuse = -> SubmitReportButton.Active = true SubmitReportButton.Image = "http://banland.xyz/asset/?id=96501119" + AbuseDropDown, _ = RbxGui.CreateDropDownMenu Abuses, UpdateAbuseFunction, true AbuseDropDown.Name = "AbuseComboBox" AbuseDropDown.Position = UDim2.new 0.425, 0, 0, 142 @@ -1155,26 +1205,26 @@ InitReportAbuse = -> CalmingAbuseBox\FindFirstChild"OkButton".MouseButton1Down\connect CloseAbuseDialog NormalAbuseBox\FindFirstChild"OkButton".MouseButton1Down\connect CloseAbuseDialog + ------------------------------------- -- Friend/unfriending ------------------------------------- --[[ gets enum val of friend status, uses pcall for some reason?(from old playerlist) @Args: - player player object to check if friends with + player player object to check if friends with @Return: enum of friend status --]] GetFriendStatus = (player) -> if player == game.Players.LocalPlayer - Enum.FriendStatus.NotFriend - else - success, result = try - game.Players.LocalPlayer\GetFriendStatus player + return Enum.FriendStatus.NotFriend else + local success, result = try + return game.Players.LocalPlayer\GetFriendStatus player if success - result + return result else - Enum.FriendStatus.NotFriend + return Enum.FriendStatus.NotFriend --[[ @@ -1192,9 +1242,9 @@ OnFriendButtonSelect = -> LocalPlayer\RequestFriendship SelectedPlayer - --PersonalServerPanel\TweenPosition UDim2.new(1,0,0,0), "Out", "Quad", .5,true + --PersonalServerPanel\TweenPosition(UDim2.new(1,0,0,0), "Out", "Quad", .5,true) ClosePopUpPanel! - --PopUpPanel\TweenPosition UDim2.new(1,0,0,0), "Out", "Linear", BASE_TWEEN,true + --PopUpPanel\TweenPosition(UDim2.new(1,0,0,0), "Out", "Linear", BASE_TWEEN,true) OnFriendRefuseButtonSelect = -> @@ -1211,37 +1261,20 @@ OnFriendRefuseButtonSelect = -> PlayerSortFunction = (a, b) -> -- prevents flipping out leaderboard if a["Score"] == b["Score"] - a["Player"].Name\upper! < b["Player"].Name\upper! - elseif not a["Score"] - false - elseif not b["Score"] - true - else - a["Score"] < b["Score"] + return a["Player"].Name\upper! < b["Player"].Name\upper! + + if not a["Score"] + return false + + if not b["Score"] + return true + + return a["Score"] < b["Score"] + --------------------------------- -- Stat Handling --------------------------------- -local UpdateMinimize -Tabify = -> - IsTabified.Value = true - IsMaximized.Value = false - IsMinimized.Value = true - UpdateMinimize! - IsTabified.Value = true - ScreenGui\TweenPosition( - UDim2.new(NormalBounds.X.Scale, NormalBounds.X.Offset - 10, 0, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - -UnTabify = -> - if IsTabified.Value - IsTabified.Value = false - ScreenGui\TweenPosition UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - -- removes and closes all leaderboard stuffs BlowThisPopsicleStand = -> --ScreenGui\Destroy! @@ -1249,6 +1282,7 @@ BlowThisPopsicleStand = -> --time to make the fanboys rage... Tabify! + --[[ used by lua's table.sort to prioritize score entries --]] @@ -1261,35 +1295,35 @@ StatSort = (a, b) -> if a.Priority == b.Priority return a.AddId < b.AddId - a.Priority < b.Priority + return a.Priority < b.Priority + -local BaseUpdate --[[ doing WAAY too much here, for optimization update only your team @Args: - playerEntry Entry of player who had a stat change - property Name of stat changed + playerEntry Entry of player who had a stat change + property Name of stat changed --]] StatChanged = (_, _) -> --playerEntry, property) -- if playerEntry['MyTeam'] -- UpdateSingleTeam playerEntry['MyTeam'] -- else BaseUpdate! - -- end + -- CreateStatTitle = (statName) -> - with MiddleTemplate\FindFirstChild"PlayerScore"\Clone! - .Name = statName - .Text = statName - -- ntitle - .TextTransparency = if IsMaximized.Value - 0 - else - 1 + ntitle = MiddleTemplate\FindFirstChild("PlayerScore")\Clone! + ntitle.Name = statName + ntitle.Text = statName + -- ntitle + if IsMaximized.Value + ntitle.TextTransparency = 0 + else + ntitle.TextTransparency = 1 + + ntitle.Parent = StatTitles - .Parent = StatTitles -local UpdateMaximize --[[ Called when stat is added if playerEntry is localplayer, will add to score names and re-sort the stats, and resize the width of the leaderboard @@ -1297,8 +1331,8 @@ local UpdateMaximize if stat is a string value, crashes the leaderboard Note: change crash to a 'tabify' leaderboard later @Args: - nchild new child value to leaderstats - playerEntry entry this stat was added to + nchild new child value to leaderstats + playerEntry entry this stat was added to --]] StatAdded = (nchild, playerEntry) -> -- dont re - add a leaderstat I alreday have @@ -1354,22 +1388,23 @@ StatAdded = (nchild, playerEntry) -> DoesStatExist = (statName, exception) -> for _, playerf in pairs PlayerFrames if playerf["Player"] ~= exception and - playerf["Player"]\FindFirstChild "leaderstats" and + playerf["Player"]\FindFirstChild"leaderstats" and playerf["Player"].leaderstats\FindFirstChild statName --print 'player:' .. playerf['Player'].Name ..' has stat' return true - false + + return false --[[ Called when stat is removed from player for all players, destroys the stat frame associated with this value, - then calls statchanged to resize frame + then calls statchanged (to resize frame) if playerEntry==localplayer, will remove from scorenames @Args: - nchild ___value to be removed - playerEntry entry of player value is being removed from + nchild ___value to be removed + playerEntry entry of player value is being removed from --]] StatRemoved = (nchild, playerEntry) -> while AddingStatLock @@ -1405,80 +1440,59 @@ RemoveAllStats = (playerEntry) -> GetScoreValue = (score) -> if score\IsA"DoubleConstrainedValue" or score\IsA "IntConstrainedValue" - score.ConstrainedValue + return score.ConstrainedValue elseif score\IsA "BoolValue" if score.Value - 1 + return 1 else - 0 + return 0 else - score.Value + return score.Value --[[ --]] MakeScoreEntry = (entry, scoreval, panel) -> - return if not panel\FindFirstChild "PlayerScore" + if not panel\FindFirstChild "PlayerScore" + return nscoretxt = panel\FindFirstChild"PlayerScore"\Clone! - local thisScore + thisScore = nil --here lies the resting place of a once great and terrible bug --may its treachery never be forgoten, lest its survivors fall for it again --RIP the leaderstat bug, oct 2012-nov 2012 wait! if entry["Player"]\FindFirstChild"leaderstats" and entry["Player"].leaderstats\FindFirstChild scoreval["Name"] - thisScore = entry["Player"]\FindFirstChild"leaderstats"\FindFirstChild scoreval["Name"] + thisScore = entry["Player"]\FindFirstChild("leaderstats")\FindFirstChild scoreval["Name"] else return - return if not entry["Player"].Parent + if not entry["Player"].Parent + return nscoretxt.Name = scoreval["Name"] - nscoretxt.Text = "#{GetScoreValue thisScore}" + nscoretxt.Text = "#{GetScoreValue(thisScore)}" if scoreval["Name"] == ScoreNames[1]["Name"] debugprint "changing score" entry["Score"] = GetScoreValue thisScore if entry["Player"] == LocalPlayer - HeaderScore.Text = "#{GetScoreValue thisScore}" + HeaderScore.Text = "#{GetScoreValue(thisScore)}" thisScore.Changed\connect -> - return if not thisScore.Parent + if not thisScore.Parent + return if scoreval["Name"] == ScoreNames[1]["Name"] entry["Score"] = GetScoreValue thisScore if entry["Player"] == LocalPlayer - HeaderScore.Text = "#{GetScoreValue thisScore}" + HeaderScore.Text = "#{GetScoreValue(thisScore)}" - - nscoretxt.Text = "#{GetScoreValue thisScore}" + nscoretxt.Text = "#{GetScoreValue(thisScore)}" BaseUpdate! - nscoretxt + return nscoretxt -FONT_SIZES = { "Size8", "Size9", "Size10", "Size11", "Size12", "Size14", "Size24", "Size36", "Size48" } ---[[ - Will fit the player's name to the bounds of the header - called on resize of the window and playedr name change events - HACK: cannot use 'Textscaled' due to unable to find text bounds when scaled ---]] -UpdateHeaderNameSize = -> - tHeader = HeaderName\Clone! - tHeader.Position = UDim2.new 2, 0, 2, 0 - tHeader.Parent = ScreenGui - fSize = 7 --Size24 in table - tHeader.FontSize = FONT_SIZES[fSize] - Delay 0.2, -> - while tHeader.TextBounds.x == 0 - wait 1 / 30 - - while tHeader.TextBounds.x - NormalBounds.X.Offset > 1 - fSize -= 1 - tHeader.FontSize = FONT_SIZES[fSize] - wait 0.2 - - HeaderName.FontSize = tHeader.FontSize - tHeader\Destroy! RecreateScoreColumns = (ptable) -> while AddingStatLock @@ -1504,7 +1518,7 @@ RecreateScoreColumns = (ptable) -> -- make an entry for this object nentry = MakeScoreEntry entry, scoreval, panel if nentry - debugprint "adding #{nentry.Name} to #{entry["Player"].Name}" + debugprint "adding " .. nentry.Name .. " to " .. entry["Player"].Name nentry.Parent = panel -- add score to team if entry["MyTeam"] and @@ -1512,7 +1526,7 @@ RecreateScoreColumns = (ptable) -> not entry["MyTeam"]["Frame"]\FindFirstChild scoreval["Name"] ntitle = nentry\Clone! - --ntitle.TextXAlignmen = 'Right' + --ntitle.TextXAlignment = 'Right' ntitle.Parent = entry["MyTeam"]["Frame"] @@ -1554,87 +1568,36 @@ RecreateScoreColumns = (ptable) -> --------------------------- -- Minimizing and maximizing --------------------------- -ExpandNames = -> - if #ScoreNames ~= 0 - for _, i in pairs StatTitles\GetChildren! - Spawn -> - TweenProperty i, "TextTransparency", i.TextTransparency, 0, BASE_TWEEN - - - HeaderFrameHeight = 0.09 - --as of writing, this and 'CloseNames' are the only places headerframe is resized - HeaderFrame\TweenSizeAndPosition( - UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), - HeaderFrame.Position, - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - TopClipFrame\TweenPosition( - UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - BottomShiftFrame\TweenPosition UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - - -CloseNames = -> - if #ScoreNames ~= 0 - HeaderFrameHeight = 0.07 - if not IsMaximized.Value - for _, i in pairs StatTitles\GetChildren! - Spawn -> - TweenProperty i, "TextTransparency", i.TextTransparency, 1, BASE_TWEEN - - - BottomShiftFrame\TweenPosition UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - HeaderFrame\TweenSizeAndPosition( - UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), - HeaderFrame.Position, - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - TopClipFrame\TweenPosition( - UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - -UpdateStatNames = -> - if not AreNamesExpanded.Value or IsMinimized.Value - CloseNames! - else - ExpandNames! ToggleMinimize = -> IsMinimized.Value = not IsMinimized.Value UpdateStatNames! + ToggleMaximize = -> IsMaximized.Value = not IsMaximized.Value - RecreateScoreColumns PlayerFrames --done to re-position stat names NOTE: optimize-able + RecreateScoreColumns(PlayerFrames) --done to re-position stat names NOTE: optimize-able ---[[ - updates position of listframe so that no gaps at the bottom or top of the list are visible - updates position of scrollbar to match what parts of the list are visible ---]] -UpdateScrollPosition = -> - minPos = GetMinScroll! - maxPos = GetMaxScroll! - scrollLength = maxPos - minPos - yscrollpos = math.max math.min(ListFrame.Position.Y.Scale, maxPos), minPos - ListFrame.Position = UDim2.new ListFrame.Position.X.Scale, ListFrame.Position.X.Offset, yscrollpos, ListFrame.Position.Y.Offset +Tabify = -> + IsTabified.Value = true + IsMaximized.Value = false + IsMinimized.Value = true + UpdateMinimize! + IsTabified.Value = true + ScreenGui\TweenPosition( + UDim2.new(NormalBounds.X.Scale, NormalBounds.X.Offset - 10, 0, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) - adjustedLength = 1 - ScrollBar.Size.Y.Scale - ScrollBar.Position = UDim2.new 0, 0, adjustedLength - (adjustedLength * ((ListFrame.Position.Y.Scale - minPos) / scrollLength)), 0 + +UnTabify = -> + if IsTabified.Value + IsTabified.Value = false + ScreenGui\TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) --[[ @@ -1660,8 +1623,8 @@ UpdateMinimize = -> MainFrame\TweenSizeAndPosition NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true --(#MiddleFrameBackgrounds*MiddleBGTemplate.Size.Y.Scale) - BottomClipFrame\TweenPosition UDim2.new(0, 0, -1, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - BottomFrame\TweenPosition UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true + BottomClipFrame\TweenPosition(UDim2.new(0, 0, -1, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + BottomFrame\TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) FocusFrame.Size = UDim2.new 1, 0, HeaderFrameHeight, 0 ExtendTab.Image = "http://banland.xyz/asset/?id=94692731" else @@ -1669,11 +1632,11 @@ UpdateMinimize = -> MainFrame\TweenSizeAndPosition NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true --do limiting - DefaultBottomClipPos = math.min math.max(DefaultBottomClipPos, -1), -1 + #MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale + DefaultBottomClipPos = math.min math.max(DefaultBottomClipPos, -1), -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) UpdateScrollPosition! BottomClipFrame.Position = UDim2.new 0, 0, DefaultBottomClipPos, 0 - bottomPositon = DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale + bottomPositon = (DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale) BottomFrame.Position = UDim2.new 0, 0, bottomPositon, 0 FocusFrame.Size = UDim2.new 1, 0, bottomPositon + HeaderFrameHeight, 0 ExtendTab.Image = "http://banland.xyz/asset/?id=94825585" @@ -1695,6 +1658,7 @@ UpdateMaximize = -> true ) + if IsMinimized.Value ToggleMinimize! else @@ -1719,11 +1683,10 @@ UpdateMaximize = -> HeaderFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["LargeHeader"] BottomFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["LargeBottom"] for index, i in ipairs MiddleFrameBackgrounds - i.Background.Image = "http://banland.xyz/asset/?id=" .. if index % 2 ~= 1 - Images["LargeDark"] + if (index % 2) ~= 1 + i.Background.Image = "http://banland.xyz/asset/?id=" .. Images["LargeDark"] else - Images["LargeLight"] - + i.Background.Image = "http://banland.xyz/asset/?id=" .. Images["LargeLight"] for _, i in ipairs MiddleFrames if i\FindFirstChild "ClickListener" @@ -1742,27 +1705,17 @@ UpdateMaximize = -> for _, entry in ipairs PlayerFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0.38, - 0, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) + WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new 0.38, 0, entry["Frame"].TitleFrame.Size.Y.Scale, 0 for _, entry in ipairs TeamFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0.38, - 0, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) + WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new 0.38, 0, entry["Frame"].TitleFrame.Size.Y.Scale, 0 else if not IsMinimized.Value MainFrame\TweenSizeAndPosition NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true - HeaderScore\TweenPosition UDim2.new(0, 0, 0.4, 0), "Out", "Linear", BASE_TWEEN * 1.2, true + HeaderScore\TweenPosition(UDim2.new(0, 0, 0.4, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) HeaderName\TweenPosition( UDim2.new(0, 0, HeaderName.Position.Y.Scale, 0), "Out", @@ -1773,19 +1726,18 @@ UpdateMaximize = -> HeaderFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["NormalHeader"] BottomFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["NormalBottom"] for index, i in ipairs MiddleFrameBackgrounds - i.Background.Image = "http://banland.xyz/asset/?id=" .. if index % 2 ~= 1 - Images["midDark"] + if index % 2 ~= 1 + i.Background.Image = "http://banland.xyz/asset/?id=" .. Images["midDark"] else - Images["midLight"] - + i.Background.Image = "http://banland.xyz/asset/?id=" .. Images["midLight"] for _, i in ipairs MiddleFrames if i\FindFirstChild "ClickListener" i.ClickListener.Size = UDim2.new 0.96, 0, i.ClickListener.Size.Y.Scale, 0 - for j in *ScoreNames - scoreval = j + for j = 1, #ScoreNames, 1 + scoreval = ScoreNames[j] if i\FindFirstChild(scoreval["Name"]) and scoreval["XOffset"] - -- print "updateing stat position: #{scoreval["Name"]}" + --print 'updateing stat position: ' .. scoreval['Name'] i[scoreval["Name"]]\TweenPosition( UDim2.new(RightEdgeSpace, -scoreval["XOffset"], 0, 0), "Out", @@ -1795,33 +1747,87 @@ UpdateMaximize = -> ) + for _, entry in ipairs TeamFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0, - BaseScreenXSize * 0.9, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) + WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new 0, BaseScreenXSize * 0.9, entry["Frame"].TitleFrame.Size.Y.Scale, 0 for _, entry in ipairs PlayerFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0, - BaseScreenXSize * 0.9, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) + WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new 0, BaseScreenXSize * 0.9, entry["Frame"].TitleFrame.Size.Y.Scale, 0 + + + +ExpandNames = -> + if #ScoreNames ~= 0 + for _, i in pairs StatTitles\GetChildren! + Spawn -> + TweenProperty i, "TextTransparency", i.TextTransparency, 0, BASE_TWEEN + + HeaderFrameHeight = 0.09 + --as of writing, this and 'CloseNames' are the only places headerframe is resized + HeaderFrame\TweenSizeAndPosition( + UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), + HeaderFrame.Position, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + TopClipFrame\TweenPosition( + UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + BottomShiftFrame\TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + + +CloseNames = -> + if #ScoreNames ~= 0 + HeaderFrameHeight = 0.07 + if not IsMaximized.Value + for _, i in pairs StatTitles\GetChildren! + Spawn -> + TweenProperty i, "TextTransparency", i.TextTransparency, 1, BASE_TWEEN + + + BottomShiftFrame\TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + HeaderFrame\TweenSizeAndPosition( + UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), + HeaderFrame.Position, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + TopClipFrame\TweenPosition( + UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + + +UpdateStatNames = -> + if not AreNamesExpanded.Value or IsMinimized.Value + CloseNames! + else + ExpandNames! + OnScrollWheelMove = (direction) -> if not (IsTabified.Value or IsMinimized.Value or InPopupWaitForClick) StartFrame = ListFrame.Position - newFrameY = math.max math.min(StartFrame.Y.Scale + direction, GetMaxScroll!), GetMinScroll! + newFrameY = math.max(math.min(StartFrame.Y.Scale + direction, GetMaxScroll!), GetMinScroll!) ListFrame.Position = UDim2.new StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset UpdateScrollPosition! AttachScrollWheel = -> - return if ScrollWheelConnections + if ScrollWheelConnections + return ScrollWheelConnections = {} table.insert( @@ -1835,6 +1841,7 @@ AttachScrollWheel = -> OnScrollWheelMove -0.05 ) + DetachScrollWheel = -> if ScrollWheelConnections for _, i in pairs ScrollWheelConnections @@ -1847,22 +1854,49 @@ FocusFrame.MouseEnter\connect -> if not (IsMinimized.Value or IsTabified.Value) AttachScrollWheel! - FocusFrame.MouseLeave\connect -> --if not (IsMaximized.Value or IsMinimized.Value) DetachScrollWheel! + -- ------------------------ -- Scroll Bar functions ------------------------ +--[[ + updates whether the scroll bar should be showing, if it is showing, updates + the size of it +--]] +UpdateScrollBarVisibility = -> + if AreAllEntriesOnScreen! + ScrollBar.BackgroundTransparency = 1 + else + ScrollBar.BackgroundTransparency = 0 + UpdateScrollBarSize! + --[[ updates size of scrollbar depending on how many entries exist --]] UpdateScrollBarSize = -> entryListSize = #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale - shownAreaSize = BottomClipFrame.Position.Y.Scale + 1 + shownAreaSize = (BottomClipFrame.Position.Y.Scale + 1) ScrollBar.Size = UDim2.new 1, 0, shownAreaSize / entryListSize, 0 +--[[ + updates position of listframe so that no gaps at the bottom or top of the list are visible + updates position of scrollbar to match what parts of the list are visible +--]] +UpdateScrollPosition = -> + minPos = GetMinScroll! + maxPos = GetMaxScroll! + scrollLength = maxPos - minPos + + yscrollpos = math.max math.min(ListFrame.Position.Y.Scale, maxPos), minPos + ListFrame.Position = UDim2.new ListFrame.Position.X.Scale, ListFrame.Position.X.Offset, yscrollpos, ListFrame.Position.Y.Offset + + adjustedLength = 1 - ScrollBar.Size.Y.Scale + ScrollBar.Position = UDim2.new 0, 0, adjustedLength - (adjustedLength * ((ListFrame.Position.Y.Scale - minPos) / scrollLength)), 0 + + --[[ prepares the needed popup to be tweened on screen, and updates the position of the popup clip frame to match the selected player frame's position @@ -1870,7 +1904,8 @@ UpdateScrollBarSize = -> InitMovingPanel = (entry, player) -> PopUpClipFrame.Parent = ScreenGui - PopUpPanel?\Destroy! + if PopUpPanel + PopUpPanel\Destroy! PopUpPanel = PopUpPanelTemplate\Clone! PopUpPanel.Parent = PopUpClipFrame @@ -1906,6 +1941,7 @@ InitMovingPanel = (entry, player) -> FriendRefuseButton.MouseButton1Click\connect OnFriendRefuseButtonSelect nextIndex += 1 + if showRankMenu BanPlayerButton = MakePopupButton PopUpPanel, "Ban", nextIndex VisitorButton = MakePopupButton PopUpPanel, "Visitor", nextIndex + 1 @@ -1952,36 +1988,28 @@ InitMovingPanel = (entry, player) -> AdminButton ) + HighlightMyRank SelectedPlayer, BanPlayerButton, VisitorButton, MemberButton, AdminButton + PopUpPanel\TweenPosition UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true Delay 0, -> + local tconnection tconnection = Mouse.Button1Down\connect -> tconnection\disconnect! ClosePopUpPanel! + myFrame = entry["Frame"] -- THIS IS GARBAGE. -- if I parent to frame to auto update position, it gets clipped -- sometimes garbage is the only option. Spawn -> while InPopupWaitForClick - PopUpClipFrame.Position = UDim2.new( - 0, myFrame.AbsolutePosition.X - PopUpClipFrame.Size.X.Offset, - 0, myFrame.AbsolutePosition.Y - ) + PopUpClipFrame.Position = UDim2.new 0, myFrame.AbsolutePosition.X - PopUpClipFrame.Size.X.Offset, 0, myFrame.AbsolutePosition.Y wait! ---[[ - updates whether the scroll bar should be showing, if it is showing, updates - the size of it ---]] -UpdateScrollBarVisibility = -> - if AreAllEntriesOnScreen! - ScrollBar.BackgroundTransparency = 1 - else - ScrollBar.BackgroundTransparency = 0 - UpdateScrollBarSize! + ActivatePlayerEntryPanel = (entry) -> entry["Frame"].BackgroundColor3 = Color3.new 0, 1, 1 @@ -1991,6 +2019,7 @@ ActivatePlayerEntryPanel = (entry) -> InPopupWaitForClick = true InitMovingPanel entry, entry["Player"] + --[[ WARNING: this is in a working state, but uses massive hacks revize when global input is available @@ -2000,6 +2029,7 @@ StartDrag = (entry, startx, starty) -> openPanel = true --[[draggedFrame = ]] WaitForChild entry["Frame"], "ClickListener" + dragExit = -> -- stopDrag = true @@ -2012,7 +2042,6 @@ StartDrag = (entry, startx, starty) -> ActivatePlayerEntryPanel entry - local startY StartFrame = ListFrame.Position dragpoll = (nx, ny) -> @@ -2020,12 +2049,12 @@ StartDrag = (entry, startx, starty) -> startY = AbsoluteToPercent(nx, ny).Y nowY = AbsoluteToPercent(nx, ny).Y - debugprint "drag dist: #{Vector2.new(startx - nx, starty - ny).magnitude}" + debugprint("drag dist:" .. Vector2.new(startx - nx, starty - ny).magnitude) if Vector2.new(startx - nx, starty - ny).magnitude > MOUSE_DRAG_DISTANCE openPanel = false - newFrameY = math.max math.min(StartFrame.Y.Scale + (nowY - startY), GetMaxScroll!), GetMinScroll! + newFrameY = math.max(math.min(StartFrame.Y.Scale + (nowY - startY), GetMaxScroll!), GetMinScroll!) ListFrame.Position = UDim2.new StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset UpdateScrollPosition! @@ -2037,15 +2066,15 @@ StartMinimizeDrag = -> startTime = tick! debugprint "Got Click2" dragExit = -> - --debugprint 'undone click2' - if tick! - startTime < 0.25 --was click + --debugprint "undone click2" + if tick! - startTime < 0.25 then --was click ToggleMinimize! else --was drag DidMinimizeDrag = true if IsMinimized.Value ToggleMinimize! - -- stopDrag = true + -- stopDrag = true local startY StartFrame = DefaultBottomClipPos @@ -2055,9 +2084,10 @@ StartMinimizeDrag = -> startY = AbsoluteToPercent(nx, ny).Y nowY = AbsoluteToPercent(nx, ny).Y + local newFrameY newFrameY = math.min( math.max(StartFrame + (nowY - startY), -1), - -1 + #MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale + -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) ) DefaultBottomClipPos = newFrameY UpdateMinimize! @@ -2070,6 +2100,8 @@ StartMinimizeDrag = -> Spawn -> WaitForClick ScreenGui, dragpoll, dragExit + + ------------------------------- -- Input Callback functions ------------------------------- @@ -2079,7 +2111,8 @@ IsMaximized.Changed\connect UpdateMaximize IsMinimized.Changed\connect UpdateMinimize ExtendButton.MouseButton1Down\connect -> - return if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick + if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick + return LastClick = time! if IsTabified.Value @@ -2089,7 +2122,8 @@ ExtendButton.MouseButton1Down\connect -> MaximizeButton.MouseButton1Click\connect -> - return if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick + if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick + return LastClick = time! if IsTabified.Value @@ -2102,7 +2136,8 @@ MaximizeButton.MouseButton1Click\connect -> MaximizeButton.MouseButton2Click\connect -> - return if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick + if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick + return LastClick = time! if IsTabified.Value @@ -2115,6 +2150,7 @@ MaximizeButton.MouseButton2Click\connect -> else Tabify! + ------------------------------- -- MiddleFrames management ------------------------------- @@ -2123,32 +2159,30 @@ MaximizeButton.MouseButton2Click\connect -> --]] AddMiddleBGFrame = -> nBGFrame = MiddleBGTemplate\Clone! - nBGFrame.Position = UDim2.new 0.5, 0, (#MiddleFrameBackgrounds * nBGFrame.Size.Y.Scale), 0 - nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" .. if (#MiddleFrameBackgrounds + 1) % 2 ~= 1 + nBGFrame.Position = UDim2.new(0.5, 0, (#MiddleFrameBackgrounds * nBGFrame.Size.Y.Scale), 0) + if (#MiddleFrameBackgrounds + 1) % 2 ~= 1 if IsMaximized.Value - Images["LargeDark"] + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["LargeDark"] else - Images["midDark"] + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["midDark"] else if IsMaximized.Value - Images["LargeLight"] + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["LargeLight"] else - Images["midLight"] - + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" .. Images["midLight"] nBGFrame.Parent = ListFrame table.insert MiddleFrameBackgrounds, nBGFrame if #MiddleFrameBackgrounds < DefaultListSize and not DidMinimizeDrag --print 'readjusting bottom clip' - DefaultBottomClipPos = -1 + #MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale + DefaultBottomClipPos = -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) if not IsMinimized.Value UpdateMinimize! - --[[ removes a background from from the listframe --]] @@ -2158,25 +2192,49 @@ RemoveMiddleBGFrame = -> if not IsMinimized.Value UpdateMinimize! - ------------------------------- -- Player Callback functions ------------------------------- +FONT_SIZES = { "Size8", "Size9", "Size10", "Size11", "Size12", "Size14", "Size24", "Size36", "Size48" } --[[ - note: should probably set to something other than mainFrame.AbsoluteSize, should work for now + Note: should probably set to something other than mainFrame.AbsoluteSize, should work for now if textbounds ever works on textscaled, switch to that :( --]] ChangeHeaderName = (nname) -> HeaderName.Text = nname UpdateHeaderNameSize! + +--[[ + Will fit the player's name to the bounds of the header + called on resize of the window and playedr name change events + HACK: cannot use 'Textscaled' due to unable to find text bounds when scaled +--]] +UpdateHeaderNameSize = -> + tHeader = HeaderName\Clone! + tHeader.Position = UDim2.new 2, 0, 2, 0 + tHeader.Parent = ScreenGui + fSize = 7 --Size24 in table + tHeader.FontSize = FONT_SIZES[fSize] + Delay 0.2, -> + while tHeader.TextBounds.x == 0 + wait 1 / 30 + + while tHeader.TextBounds.x - NormalBounds.X.Offset > 1 + fSize -= 1 + tHeader.FontSize = FONT_SIZES[fSize] + wait 0.2 + + HeaderName.FontSize = tHeader.FontSize + tHeader\Destroy! + ScreenGui.Changed\connect UpdateHeaderNameSize --[[ called only when the leaderstats object is added to a given player entry removes old stats, adds any existing stats, and sets up listeners for new stats @Args: - playerEntry A reference to the ENTRY(table) of the player who had leaderstats added + playerEntry A reference to the ENTRY(table) of the player who had leaderstats added --]] LeaderstatsAdded = (playerEntry) -> --RemoveAllStats playerEntry @@ -2190,28 +2248,28 @@ LeaderstatsAdded = (playerEntry) -> nplayer.leaderstats.ChildRemoved\connect (nchild) -> StatRemoved nchild, playerEntry - --[[ called when leaderstats object is removed from play in player entry Note: may not be needed, might be able to just rely on leaderstats added @Args: - oldLeaderstats leaderstats object to be removed - playerEntry A reference to the ENTRY(table) of the player + oldLeaderstats leaderstats object to be removed + playerEntry A reference to the ENTRY(table) of the player --]] LeaderstatsRemoved = (_, playerEntry) -> while AddingFrameLock - debugprint "waiting to insert #{playerEntry["Player"].Name}" + debugprint "waiting to insert " .. playerEntry["Player"].Name wait 1 / 30 AddingFrameLock = true RemoveAllStats playerEntry AddingFrameLock = false + --[[ Called when a player entry in the leaderboard is clicked either will highlight entry and start the drag event, or open a popup menu @Args: - entry the player entry clicked + entry the player entry clicked --]] OnPlayerEntrySelect = (entry, startx, starty) -> if not InPopupWaitForClick @@ -2220,6 +2278,7 @@ OnPlayerEntrySelect = (entry, startx, starty) -> StartDrag entry, startx, starty + --[[ the basic update for the playerlist mode's state, assures the order and length of the player frames @@ -2235,198 +2294,16 @@ PlayerListModeUpdate = -> UpdateMinimize! -RemoveNeutralTeam = -> - while NeutralTeamLock - debugprint "in neutral team lock" - wait! - - NeutralTeamLock = true - NeutralTeam["Frame"]\Destroy! - NeutralTeam = nil - RemoveMiddleBGFrame! - NeutralTeamLock = false - ---[[ - removes a single player from a given team (not usually called directly) - @Args: - teamEntry team entry to remove player from - index index of player in 'MyPlayers' list to remove ---]] -RemovePlayerFromTeam = (teamEntry, index) -> - table.remove teamEntry["MyPlayers"], index - --if teamEntry['AutoHide'] and #teamEntry['MyPlayers'] == 0 - if teamEntry == NeutralTeam and #teamEntry["MyPlayers"] == 0 - RemoveNeutralTeam! - ---[[ - finds previous team this player was on, and if it exists calls removeplayerfromteam - @Args - entry Player entry ---]] -FindRemovePlayerFromTeam = (entry) -> - if entry["MyTeam"] - for j, oldEntry in ipairs entry["MyTeam"]["MyPlayers"] - if oldEntry["Player"] == entry["Player"] - RemovePlayerFromTeam entry["MyTeam"], j - return - - elseif NeutralTeam - for j, oldEntry in ipairs NeutralTeam["MyPlayers"] - if oldEntry["Player"] == entry["Player"] - RemovePlayerFromTeam NeutralTeam, j - return - ---[[ - adds player entry entry to teamentry - removes them from any previous team - @Args: - teamEntry entry of team to add player to - entry player entry to add to this team ---]] -AddPlayerToTeam = (teamEntry, entry) -> - FindRemovePlayerFromTeam entry - table.insert teamEntry["MyPlayers"], entry - entry["MyTeam"] = teamEntry - if teamEntry["IsHidden"] - teamEntry["Frame"].Parent = ListFrame - AddMiddleBGFrame! - - teamEntry["IsHidden"] = false - ---[[ - adds a neutral team if nessisary - Note: a lot of redundant code here, might want to refactor to share a function with insertteamframe ---]] -AddNeutralTeam = -> - while NeutralTeamLock - debugprint "in neutral team 2 lock" - wait! - - NeutralTeamLock = true - - defaultTeam = Instance.new "Team" - defaultTeam.TeamColor = BrickColor.new "White" - defaultTeam.Name = "Neutral" - nentry = {} - nentry["MyTeam"] = defaultTeam - nentry["MyPlayers"] = {} - nentry["Frame"] = MiddleTemplate\Clone! - WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = defaultTeam.Name - nentry["Frame"].TitleFrame.Position = UDim2.new( - nentry["Frame"].TitleFrame.Position.X.Scale, - nentry["Frame"].TitleFrame.Position.X.Offset, - 0.1, - 0 - ) - nentry["Frame"].TitleFrame.Size = UDim2.new( - nentry["Frame"].TitleFrame.Size.X.Scale, - nentry["Frame"].TitleFrame.Size.X.Offset, - 0.8, - 0 - ) - nentry["Frame"].TitleFrame.Title.Font = "ArialBold" - nentry["Frame"].Position = UDim2.new 1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0 - WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down\connect (nx, ny) -> - StartDrag nentry, nx, ny - - nentry["Frame"].ClickListener.BackgroundColor3 = Color3.new 1, 1, 1 - nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 - nentry["Frame"].ClickListener.AutoButtonColor = false - nentry["AutoHide"] = true - nentry["IsHidden"] = true - for _, i in pairs PlayerFrames - if i["Player"].Neutral or not i["MyTeam"] - AddPlayerToTeam nentry, i - - if #nentry["MyPlayers"] > 0 - NeutralTeam = nentry - UpdateMinimize! - BaseUpdate! - - NeutralTeamLock = false - -SetPlayerToTeam = (entry) -> - FindRemovePlayerFromTeam entry - -- check to see if team exists, if it does add to that team - setToTeam = false - for _, tframe in ipairs TeamFrames - -- add my entry on the new team - if tframe["MyTeam"].TeamColor == entry["Player"].TeamColor - AddPlayerToTeam tframe, entry - setToTeam = true - - -- if player was set to an invalid team, then set it back to neutral - if not setToTeam and #(game.Teams\GetTeams!) > 0 - debugprint "#{entry["Player"].Name} could not find team" - entry["MyTeam"] = nil - if not NeutralTeam - AddNeutralTeam! - else - AddPlayerToTeam NeutralTeam, entry - ---[[ - Note: another big one, consiter breaking up - called when any children of player changes - handles 'Neutral', teamColor, Name and MembershipType changes - @Args - entry Player entry changed - property name of property changed ---]] -PlayerChanged = (entry, property) -> - while PlayerChangedLock - debugprint "in playerchanged lock" - wait 1 / 30 - - PlayerChangedLock = true - if property == "Neutral" - -- if player changing to neutral - if entry["Player"].Neutral and #game.Teams\GetTeams! > 0 - debugprint "#{entry["Player"].Name} setting to neutral" - FindRemovePlayerFromTeam entry - entry["MyTeam"] = nil - if not NeutralTeam - debugprint "#{entry["Player"].Name} creating neutral team" - AddNeutralTeam! - else - debugprint "#{entry["Player"].Name} adding to neutral team" - AddPlayerToTeam NeutralTeam, entry - - elseif #(game.Teams\GetTeams!) > 0 -- else player switching to a team, or a weird edgecase - debugprint "#{entry["Player"].Name} has been set non-neutral" - SetPlayerToTeam entry - - BaseUpdate! - elseif property == "TeamColor" and not entry["Player"].Neutral and entry["Player"] ~= entry["MyTeam"] - debugprint "#{entry["Player"].Name} setting to new team" - SetPlayerToTeam entry - BaseUpdate! - elseif property == "Name" or property == "MembershipType" - entry["Frame"]\FindFirstChild"BCLabel".Image = getMembershipTypeIcon( - entry["Player"].MembershipType, entry["Player"].Name - ) - entry["Frame"].Name = entry["Player"].Name - entry["Frame"].TitleFrame.Title.Text = entry["Player"].Name - if entry["Frame"].BCLabel.Image ~= "" - entry["Frame"].TitleFrame.Title.Position = UDim2.new 0.01, 30, 0.1, 0 - - if entry["Player"] == LocalPlayer - entry["Frame"].TitleFrame.DropShadow.Text = entry["Player"].Name - ChangeHeaderName entry["Player"].Name - - BaseUpdate! - - PlayerChangedLock = false - --[[ this one's a doozie, happens when a player is added to the game inits their player frame and player entry, assigns them to a team if possible, and hooks up their leaderstats @Args: - nplayer new player object to insert + nplayer new player object to insert --]] InsertPlayerFrame = (nplayer) -> while AddingFrameLock - debugprint "waiting to insert #{nplayer.Name}" + debugprint "waiting to insert " .. nplayer.Name wait 1 / 30 AddingFrameLock = true @@ -2434,7 +2311,7 @@ InsertPlayerFrame = (nplayer) -> nFrame = MiddleTemplate\Clone! WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = nplayer.Name - nFrame.Position = UDim2.new 1, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0 + nFrame.Position = UDim2.new(1, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0) nfriendstatus = GetFriendStatus nplayer @@ -2455,20 +2332,19 @@ InsertPlayerFrame = (nplayer) -> nFrame.TitleFrame.Title.Font = "ArialBold" nFrame.PlayerScore.Font = "ArialBold" ChangeHeaderName nplayer.Name - with nFrame.TitleFrame.Title\Clone! - .TextColor3 = Color3.new 0, 0, 0 - .TextTransparency = 0 - .ZIndex = 2 - .Position = nFrame.TitleFrame.Title.Position + UDim2.new 0, 1, 0, 1 - .Name = "DropShadow" - .Parent = nFrame.TitleFrame + dropShadow = nFrame.TitleFrame.Title\Clone! + dropShadow.TextColor3 = Color3.new 0, 0, 0 + dropShadow.TextTransparency = 0 + dropShadow.ZIndex = 2 + dropShadow.Position = nFrame.TitleFrame.Title.Position + UDim2.new 0, 1, 0, 1 + dropShadow.Name = "DropShadow" + dropShadow.Parent = nFrame.TitleFrame -- else - -- --Delay 2, -> OnFriendshipChanged(nplayer,LocalPlayer\GetFriendStatus(nplayer)) end) - + -- --Delay(2, function () OnFriendshipChanged(nplayer,LocalPlayer\GetFriendStatus(nplayer)) nFrame.TitleFrame.Title.Font = "ArialBold" nFrame.Parent = ListFrame - nFrame\TweenPosition UDim2.new(0.5, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0), "Out", "Linear", BASE_TWEEN, true + nFrame\TweenPosition(UDim2.new(0.5, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0), "Out", "Linear", BASE_TWEEN, true) UpdateMinimize! nentry = {} nentry["Frame"] = nFrame @@ -2502,6 +2378,7 @@ InsertPlayerFrame = (nplayer) -> nentry["MyTeam"] = NeutralTeam + if nplayer\FindFirstChild "leaderstats" LeaderstatsAdded nentry @@ -2521,7 +2398,6 @@ InsertPlayerFrame = (nplayer) -> if nplayer == LocalPlayer and nchild.Name == "leaderstats" LeaderstatsRemoved nchild, nentry - nplayer.Changed\connect (prop) -> PlayerChanged nentry, prop @@ -2563,6 +2439,8 @@ RemovePlayerFrame = (tplayer) -> if tentry["Player"] == tplayer RemovePlayerFromTeam tteam, j + + RemoveMiddleBGFrame! UpdateMinimize! BaseUpdate! @@ -2574,12 +2452,13 @@ Players.ChildRemoved\connect RemovePlayerFrame ---------------------------- -- Team Callback Functions ---------------------------- + --[[ turns a list of team entries with sub lists of players into a single ordered list, in the correct order,and of the correct length @Args: - tframes the team entries to unroll - outframes the list to unroll these entries into + tframes the team entries to unroll + outframes the list to unroll these entries into --]] UnrollTeams = (tframes, outframes) -> numEntries = 0 @@ -2600,7 +2479,7 @@ UnrollTeams = (tframes, outframes) -> numEntries += 1 outframes[numEntries] = val["Frame"] - -- clear any additional entries from outframes + -- clear any additional entries from outframes for i = numEntries + 1, #outframes, 1 outframes[i] = nil @@ -2618,20 +2497,22 @@ TeamSortFunc = (a, b) -> if not b["TeamScore"] return true - a["TeamScore"] < b["TeamScore"] + return a["TeamScore"] < b["TeamScore"] + --[[ adds up all the score of this team's players to form the team score @Args: - team team entry to sum the scores of + team team entry to sum the scores of --]] AddTeamScores = (team) -> - for i in *ScoreNames + for k = 1, #ScoreNames + i = ScoreNames[k] tscore = 0 for _, j in ipairs team["MyPlayers"] - tval = j["Player"]\FindFirstChild "leaderstats" and j["Player"].leaderstats\FindFirstChild i["Name"] + tval = j["Player"]\FindFirstChild"leaderstats" and j["Player"].leaderstats\FindFirstChild i["Name"] if tval and not tval\IsA "StringValue" - tscore += GetScoreValue j["Player"].leaderstats[i["Name"]] + tscore += GetScoreValue((j["Player"].leaderstats)[i["Name"]]) if team["Frame"]\FindFirstChild i["Name"] --team['Frame'][i['Name'] ].Size = UDim2.new(1 - (ScrollBarFrame.Size.X.Scale * 2),- ((j-1) * SpacingPerStat),1,0) @@ -2639,11 +2520,12 @@ AddTeamScores = (team) -> UpdateMinimize! + --[[ consider adding lock with wait for performance sorts each of the team's player lists induvidually, adds up the team scores. @Args: - tentries table of team entries + tentries table of team entries --]] SortTeams = (tentries) -> for _, val in ipairs tentries @@ -2652,6 +2534,7 @@ SortTeams = (tentries) -> table.sort tentries, TeamSortFunc + --[[ base update for team mode, adds up the scores of all teams, sorts them, then unrolls them into middleframes @@ -2665,26 +2548,212 @@ TeamListModeUpdate = -> UnrollTeams TeamFrames, MiddleFrames + +--[[ + finds previous team this player was on, and if it exists calls removeplayerfromteam + @Args + entry Player entry +--]] +FindRemovePlayerFromTeam = (entry) -> + if entry["MyTeam"] + for j, oldEntry in ipairs entry["MyTeam"]["MyPlayers"] + if oldEntry["Player"] == entry["Player"] + RemovePlayerFromTeam entry["MyTeam"], j + return + + elseif NeutralTeam + for j, oldEntry in ipairs NeutralTeam["MyPlayers"] + if oldEntry["Player"] == entry["Player"] + RemovePlayerFromTeam NeutralTeam, j + return + + + +--[[ + removes a single player from a given team (not usually called directly) + @Args: + teamEntry team entry to remove player from + index index of player in 'MyPlayers' list to remove +--]] +RemovePlayerFromTeam = (teamEntry, index) -> + table.remove teamEntry["MyPlayers"], index + --if teamEntry['AutoHide'] and #teamEntry['MyPlayers'] == 0 + if teamEntry == NeutralTeam and #teamEntry["MyPlayers"] == 0 + RemoveNeutralTeam! + + +--[[ + adds player entry entry to teamentry + removes them from any previous team + @Args: + teamEntry entry of team to add player to + entry player entry to add to this team +--]] +AddPlayerToTeam = (teamEntry, entry) -> + FindRemovePlayerFromTeam entry + table.insert teamEntry["MyPlayers"], entry + entry["MyTeam"] = teamEntry + if teamEntry["IsHidden"] + teamEntry["Frame"].Parent = ListFrame + AddMiddleBGFrame! + + teamEntry["IsHidden"] = false + + +SetPlayerToTeam = (entry) -> + FindRemovePlayerFromTeam entry + -- check to see if team exists, if it does add to that team + setToTeam = false + for _, tframe in ipairs TeamFrames + -- add my entry on the new team + if tframe["MyTeam"].TeamColor == entry["Player"].TeamColor + AddPlayerToTeam tframe, entry + setToTeam = true + + -- if player was set to an invalid team, then set it back to neutral + if not setToTeam and #(game.Teams\GetTeams!) > 0 + debugprint entry["Player"].Name .. "could not find team" + entry["MyTeam"] = nil + if not NeutralTeam + AddNeutralTeam! + else + AddPlayerToTeam NeutralTeam, entry + + + +--[[ + Note: another big one, consiter breaking up + called when any children of player changes + handles 'Neutral', teamColor, Name and MembershipType changes + @Args + entry Player entry changed + property name of property changed +--]] +PlayerChanged = (entry, property) -> + while PlayerChangedLock + debugprint "in playerchanged lock" + wait 1 / 30 + + PlayerChangedLock = true + if property == "Neutral" + -- if player changing to neutral + if entry["Player"].Neutral and #(game.Teams\GetTeams!) > 0 + debugprint entry["Player"].Name .. "setting to neutral" + FindRemovePlayerFromTeam entry + entry["MyTeam"] = nil + if not NeutralTeam + debugprint entry["Player"].Name .. "creating neutral team" + AddNeutralTeam! + else + debugprint entry["Player"].Name .. "adding to neutral team" + AddPlayerToTeam NeutralTeam, entry + + elseif #(game.Teams\GetTeams!) > 0 then -- else player switching to a team, or a weird edgecase + debugprint entry["Player"].Name .. "has been set non-neutral" + SetPlayerToTeam entry + + BaseUpdate! + elseif property == "TeamColor" and not entry["Player"].Neutral and entry["Player"] ~= entry["MyTeam"] + debugprint entry["Player"].Name .. "setting to new team" + SetPlayerToTeam entry + BaseUpdate! + elseif property == "Name" or property == "MembershipType" + entry["Frame"]\FindFirstChild"BCLabel".Image = getMembershipTypeIcon entry["Player"].MembershipType, entry["Player"].Name + entry["Frame"].Name = entry["Player"].Name + entry["Frame"].TitleFrame.Title.Text = entry["Player"].Name + if entry["Frame"].BCLabel.Image ~= "" + entry["Frame"].TitleFrame.Title.Position = UDim2.new 0.01, 30, 0.1, 0 + + if entry["Player"] == LocalPlayer + entry["Frame"].TitleFrame.DropShadow.Text = entry["Player"].Name + ChangeHeaderName entry["Player"].Name + + BaseUpdate! + + PlayerChangedLock = false + + OnFriendshipChanged = (player, friendStatus) -> Delay 0.5, -> - debugprint "friend status changed for: #{player.Name} #{friendStatus} vs #{GetFriendStatus player}" - + debugprint( + "friend status changed for:" .. + player.Name .. + " " .. + "#{friendStatus}" .. + " vs " .. + "#{GetFriendStatus(player)}" + ) for _, entry in ipairs PlayerFrames if entry["Player"] == player nicon = getFriendStatusIcon friendStatus if nicon == "" and entry["Frame"].FriendLabel.Image ~= "" - entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position - - UDim2.new 0, 17, 0, 0 + entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position - UDim2.new 0, 17, 0, 0 elseif nicon ~= "" and entry["Frame"].FriendLabel.Image == "" - entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + - UDim2.new 0, 17, 0, 0 - debugprint "confirmed status: #{player.Name}" + entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + UDim2.new 0, 17, 0, 0 + debugprint "confirmed status:" .. player.Name entry["Frame"].FriendLabel.Image = nicon return + + LocalPlayer.FriendStatusChanged\connect OnFriendshipChanged +--[[ + adds a neutral team if nessisary + Note: a lot of redundant code here, might want to refactor to share a function with insertteamframe +--]] +AddNeutralTeam = -> + while NeutralTeamLock + debugprint "in neutral team 2 lock" + wait! + + NeutralTeamLock = true + + defaultTeam = Instance.new "Team" + defaultTeam.TeamColor = BrickColor.new "White" + defaultTeam.Name = "Neutral" + nentry = {} + nentry["MyTeam"] = defaultTeam + nentry["MyPlayers"] = {} + nentry["Frame"] = MiddleTemplate\Clone! + WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = defaultTeam.Name + nentry["Frame"].TitleFrame.Position = UDim2.new nentry["Frame"].TitleFrame.Position.X.Scale, nentry["Frame"].TitleFrame.Position.X.Offset, 0.1, 0 + nentry["Frame"].TitleFrame.Size = UDim2.new nentry["Frame"].TitleFrame.Size.X.Scale, nentry["Frame"].TitleFrame.Size.X.Offset, 0.8, 0 + nentry["Frame"].TitleFrame.Title.Font = "ArialBold" + nentry["Frame"].Position = UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) + WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down\connect (nx, ny) -> + StartDrag nentry, nx, ny + + nentry["Frame"].ClickListener.BackgroundColor3 = Color3.new 1, 1, 1 + nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 + nentry["Frame"].ClickListener.AutoButtonColor = false + nentry["AutoHide"] = true + nentry["IsHidden"] = true + for _, i in pairs PlayerFrames + if i["Player"].Neutral or not i["MyTeam"] + AddPlayerToTeam nentry, i + + if #nentry["MyPlayers"] > 0 + NeutralTeam = nentry + UpdateMinimize! + BaseUpdate! + + NeutralTeamLock = false + + +RemoveNeutralTeam = -> + while NeutralTeamLock + debugprint "in neutral team lock" + wait! + + NeutralTeamLock = true + NeutralTeam["Frame"]\Destroy! + NeutralTeam = nil + RemoveMiddleBGFrame! + NeutralTeamLock = false + + --[[ --]] @@ -2705,6 +2774,7 @@ TeamChildAdded = (entry, nchild) -> nchild.Changed\connect -> TeamScoreChanged entry, nchild.Value + --[[ called when child added to a team, used for autohide functionality Note: still has teamscore, consiter removing @@ -2716,10 +2786,108 @@ TeamChildRemoved = (entry, nchild) -> WaitForChild(entry["Frame"], "PlayerScore").Text = "" entry["TeamScore"] = nil + +TeamChanged = (entry, property) -> + if property == "Name" + WaitForChild(WaitForChild(entry["Frame"], "TitleFrame"), "Title").Text = entry["MyTeam"].Name + elseif property == "TeamColor" + entry["Frame"].ClickListener.BackgroundColor3 = entry["MyTeam"].TeamColor.Color + + for _, i in pairs TeamFrames + if i["MyTeam"].TeamColor == entry["MyTeam"] + RemoveTeamFrame(entry["MyTeam"]) --NO DUPLICATE TEAMS! + + + entry["MyPlayers"] = {} + + for _, i in pairs PlayerFrames + SetPlayerToTeam i + + BaseUpdate! + + +--[[ + creates team entry and frame for this team, sets up listeners for this team + adds any players intended for this team,Creates neutral team if this is the first team added + Note: might be best to break this into multiple functions to simplify + @Args: + nteam new team object added +--]] +InsertTeamFrame = (nteam) -> + while AddingFrameLock + debugprint "in adding team frame lock" + wait 1 / 30 + + AddingFrameLock = true + --for _,i in pairs TeamFrames + nentry = {} + nentry["MyTeam"] = nteam + nentry["MyPlayers"] = {} + nentry["Frame"] = MiddleTemplate\Clone! + WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = nteam.Name + nentry["Frame"].TitleFrame.Title.Font = "ArialBold" + nentry["Frame"].TitleFrame.Title.FontSize = "Size18" + nentry["Frame"].TitleFrame.Position = UDim2.new nentry["Frame"].TitleFrame.Position.X.Scale, nentry["Frame"].TitleFrame.Position.X.Offset, 0.1, 0 + nentry["Frame"].TitleFrame.Size = UDim2.new nentry["Frame"].TitleFrame.Size.X.Scale, nentry["Frame"].TitleFrame.Size.X.Offset, 0.8, 0 + nentry["Frame"].Position = UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) + WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down\connect (nx, ny) -> + StartDrag nentry, nx, ny + + nentry["Frame"].ClickListener.BackgroundColor3 = nteam.TeamColor.Color + nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 + nentry["Frame"].ClickListener.AutoButtonColor = false + AddId += 1 + nentry["ID"] = AddId + nentry["AutoHide"] = false + if nteam\FindFirstChild "AutoHide" + nentry["AutoHide"] = true + + if nteam\FindFirstChild "TeamScore" + TeamChildAdded nentry, nteam.TeamScore + + + nteam.ChildAdded\connect (nchild) -> + TeamChildAdded nentry, nchild + + nteam.ChildRemoved\connect (nchild) -> + TeamChildRemoved nentry, nchild + + nteam.Changed\connect (prop) -> + TeamChanged nentry, prop + + + for _, i in pairs PlayerFrames + if not i["Player"].Neutral and i["Player"].TeamColor == nteam.TeamColor + AddPlayerToTeam nentry, i + + nentry["IsHidden"] = false + if not nentry["AutoHide"] or #nentry["MyPlayers"] > 0 + nentry["Frame"].Parent = ListFrame + nentry["Frame"]\TweenPosition( + UDim2.new(0.5, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + AddMiddleBGFrame! + else + nentry["IsHidden"] = true + nentry["Frame"].Parent = nil + + + table.insert TeamFrames, nentry + UpdateMinimize! + BaseUpdate! + if #TeamFrames == 1 and not NeutralTeam + AddNeutralTeam! + + AddingFrameLock = false + --[[ removes team from team list @Args: - nteam Teamobject to remove + nteam Teamobject to remove --]] RemoveTeamFrame = (nteam) -> while AddingFrameLock @@ -2728,7 +2896,6 @@ RemoveTeamFrame = (nteam) -> AddingFrameLock = true -- if IsMinimized.Value - -- end local myEntry for i, key in ipairs TeamFrames if nteam == key["MyTeam"] @@ -2749,108 +2916,13 @@ RemoveTeamFrame = (nteam) -> BaseUpdate! AddingFrameLock = false -TeamChanged = (entry, property) -> - if property == "Name" - WaitForChild(WaitForChild(entry["Frame"], "TitleFrame"), "Title").Text = entry["MyTeam"].Name - elseif property == "TeamColor" - entry["Frame"].ClickListener.BackgroundColor3 = entry["MyTeam"].TeamColor.Color - for _, i in pairs TeamFrames - if i["MyTeam"].TeamColor == entry["MyTeam"] - RemoveTeamFrame entry["MyTeam"] --NO DUPLICATE TEAMS! +TeamAdded = (nteam) -> + InsertTeamFrame nteam - entry["MyPlayers"] = {} - for _, i in pairs PlayerFrames - SetPlayerToTeam i - - BaseUpdate! - ---[[ - creates team entry and frame for this team, sets up listeners for this team - adds any players intended for this team,Creates neutral team if this is the first team added - Note: might be best to break this into multiple functions to simplify - @Args: - nteam new team object added ---]] -InsertTeamFrame = (nteam) -> - while AddingFrameLock - debugprint "in adding team frame lock" - wait 1 / 30 - - AddingFrameLock = true - --for _,i in pairs TeamFrames - - with n = nentry["Frame"] - nentry = {} - nentry["MyTeam"] = nteam - nentry["MyPlayers"] = {} - nentry["Frame"] = MiddleTemplate\Clone! - WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = nteam.Name - .TitleFrame.Title.Font = "ArialBold" - .TitleFrame.Title.FontSize = "Size18" - .TitleFrame.Position = UDim2.new( - .TitleFrame.Position.X.Scale, - .TitleFrame.Position.X.Offset, - 0.1, - 0 - ) - .TitleFrame.Size = UDim2.new( - .TitleFrame.Size.X.Scale, - .TitleFrame.Size.X.Offset, - 0.8, - 0 - ) - .Position = UDim2.new(1, 0, (#MiddleFrames * .Size.Y.Scale), 0) - WaitForChild(n, "ClickListener").MouseButton1Down\connect (nx, ny) -> - StartDrag nentry, nx, ny - - .ClickListener.BackgroundColor3 = nteam.TeamColor.Color - .ClickListener.BackgroundTransparency = 0.7 - .ClickListener.AutoButtonColor = false - AddId += 1 - nentry["ID"] = AddId - nentry["AutoHide"] = false - - if nteam\FindFirstChild "AutoHide" - nentry["AutoHide"] = true - - if nteam\FindFirstChild "TeamScore" - TeamChildAdded nentry, nteam.TeamScore - - nteam.ChildAdded\connect (nchild) -> TeamChildAdded nentry, nchild - nteam.ChildRemoved\connect (nchild) -> TeamChildRemoved nentry, nchild - nteam.Changed\connect (prop) -> TeamChanged nentry, prop - - for _, i in pairs PlayerFrames - if not i["Player"].Neutral and i["Player"].TeamColor == nteam.TeamColor - AddPlayerToTeam nentry, i - - nentry["IsHidden"] = false - if not nentry["AutoHide"] or #nentry["MyPlayers"] > 0 - .Parent = ListFrame - nentry["Frame"]\TweenPosition( - UDim2.new(0.5, 0, (#MiddleFrames * .Size.Y.Scale), 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - AddMiddleBGFrame! - else - nentry["IsHidden"] = true - .Parent = nil - - table.insert TeamFrames, nentry - UpdateMinimize! - BaseUpdate! - if #TeamFrames == 1 and not NeutralTeam - AddNeutralTeam! - - AddingFrameLock = false - -TeamAdded = (nteam) -> InsertTeamFrame nteam -TeamRemoved = (nteam) -> RemoveTeamFrame nteam +TeamRemoved = (nteam) -> + RemoveTeamFrame nteam --------------------------------- --[[ @@ -2872,7 +2944,7 @@ BaseUpdate = -> TeamListModeUpdate! for i, key in ipairs MiddleFrames - if not key.Parent? + if key.Parent ~= nil key\TweenPosition( UDim2.new(0.5, 0, ((#MiddleFrames - i) * key.Size.Y.Scale), 0), "Out", @@ -2902,7 +2974,7 @@ LastTabTime = time! game.GuiService.KeyPressed\connect (key) -> if key == "\t" debugprint "caught tab key" - modalCheck, isModal = try + local modalCheck, isModal = try return game.GuiService.IsModalDialog if modalCheck == false or (modalCheck and isModal == false) @@ -2925,8 +2997,6 @@ game.GuiService.KeyPressed\connect (key) -> else ToggleMaximize! -debugPlayerAdd = (p) -> - InsertPlayerFrame p PlayersChildAdded = (tplayer) -> if tplayer\IsA "Player" @@ -2936,6 +3006,7 @@ PlayersChildAdded = (tplayer) -> else BlowThisPopsicleStand! + coreGuiChanged = (coreGuiType, enabled) -> if coreGuiType == Enum.CoreGuiType.All or coreGuiType == Enum.CoreGuiType.PlayerList MainFrame.Visible = enabled @@ -2954,14 +3025,19 @@ TeamsChildRemoved = (nteam) -> else BlowThisPopsicleStand! + ---------------------------- -- Hookups and initialization ---------------------------- +debugPlayerAdd = (p) -> + InsertPlayerFrame p + try - coreGuiChanged Enum.CoreGuiType.PlayerList, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.PlayerList + coreGuiChanged(Enum.CoreGuiType.PlayerList, Game.StarterGui\GetCoreGuiEnabled(Enum.CoreGuiType.PlayerList)) Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged + while not game\GetService "Teams" wait 1 / 30 debugprint "Waiting For Teams" @@ -2973,6 +3049,7 @@ for _, i in pairs Players\GetPlayers! Spawn -> debugPlayerAdd i + game.Teams.ChildAdded\connect TeamsChildAdded game.Teams.ChildRemoved\connect TeamsChildRemoved Players.ChildAdded\connect PlayersChildAdded @@ -2996,7 +3073,7 @@ if LocalPlayer.Name == "newplayerlistisbad" or LocalPlayer.Name == "imtotallyadm while true str_players = "" for _, i in pairs game.Players\GetPlayers! - str_players ..= " #{i.Name}" + str_players = str_players .. " " .. i.Name debugplayers.Text = str_players wait 0.5