--[[ | This file was obtained through the combined efforts | of Madbluntz & Plymouth Antiquarian Society. | | Credits: lifestorm, Gregory Wayne Rossel JR., | Maloy, DrPepper10 @ RIP, Atle! | | Visit for more: https://plymouth.thetwilightzone.ru/ --]] local PLUGIN = PLUGIN local PANEL = {} local boxPattern = Material("willardnetworks/tabmenu/crafting/box_pattern.png", "noclamp") -- Shared frame painting function between two VGUI registrations local function PaintFrames(self, w, h, bCustom) local value = 100 if bCustom then value = 200 end if isnumber(bCustom) then value = bCustom end local color if !isnumber(bCustom) then color = Color(0, 0, 0, value) else color = Color(25, 25, 25, value) end surface.SetDrawColor(color) surface.DrawRect(0, 0, w, h) if bCustom then surface.SetDrawColor(ColorAlpha(color_white, 30)) surface.SetMaterial(boxPattern) surface.DrawTexturedRectUV( 0, 0, w, h, 0, 0, w / SScaleMin(414 / 3), h / SScaleMin(677 / 3) ) end surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30))) surface.DrawOutlinedRect(0, 0, w, h) end function PANEL:Init() ix.gui.group = self local titlePushDown = SScaleMin(30 / 3) local padding = SScaleMin(30 / 3) local margin = SScaleMin(10 / 3) local iconSize = SScaleMin(18 / 3) local topPushDown = SScaleMin(150 / 3) local scale780 = SScaleMin(780 / 3) local scale120 = SScaleMin(120 / 3) self:SetWide(ScrW() - (topPushDown * 2)) local sizeXtitle, sizeYtitle = self:GetWide(), scale120 local sizeXcontent, sizeYcontent = self:GetWide(), (scale780) self.titlePanel = self:Add("Panel") self.titlePanel:SetSize(sizeXtitle, sizeYtitle) self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5) self.titlePanel.noRemove = true self:CreateTitleText() self.padding = SScaleMin(15 / 3) self.contentFrame = self:Add("Panel") self.contentFrame:SetSize(sizeXcontent, sizeYcontent) self.contentFrame:SetPos(self:GetWide() * 0.5 - self.contentFrame:GetWide() * 0.5, titlePushDown) self.contentFrame.noRemove = true self.contentFrame.Paint = function(self, w, h) PaintFrames(self, w, h) end self:SetTall(scale120 + scale780 + titlePushDown) self:Center() self.receivedMembers = nil self:Rebuild() end function PANEL:CreateTitleText() local groupTitleIcon = self.titlePanel:Add("DImage") groupTitleIcon:SetImage("willardnetworks/tabmenu/charmenu/faction.png") groupTitleIcon:SetSize(SScaleMin(23 / 3), SScaleMin(17 / 3)) self.groupTitle = self.titlePanel:Add("DLabel") self.groupTitle:SetFont("TitlesFontNoClamp") self.groupTitle:SetText("Grup") self.groupTitle:SizeToContents() self.groupTitle:SetPos(SScaleMin(33 / 3), SScaleMin(16 / 3) * 0.5 - self.groupTitle:GetTall() * 0.5) end function PANEL:Rebuild() self.contentFrame:Clear() self.buttonlist = {} local character = LocalPlayer():GetCharacter() local group = character:GetGroup() if (group) then if (group.active) then self:CreateActiveGroupPanel(group, character) else self:CreateNonActiveGroupPanel(group) end else self:CreateCreationPanel() end end -- The creation panel of groups function PANEL:CreateCreationPanel() self:CreateLogo(0.21) -- Create group creation title local title = self.contentFrame:Add("DLabel") self:CreateTitleLabel(title, string.utf8upper("grup yaratma")) -- Create info text local infoText = self.contentFrame:Add("DLabel") self:CreateLabel(infoText, "Bu araç size oyuncuları bir araya getirme yeteneği sağlar. Bir bilgi sekmesine, üyeler listesine, hikaye sekmesine ve özelleştirilebilir roller için erişim sağlarsınız. Birden fazla grupta olamazsınız, sadece bir tane.", Color(230, 230, 230, 255)) -- Create warning text local warningText = self.contentFrame:Add("DLabel") self:CreateLabel(warningText, "Unutmayın, hikaye dostu olmayan isimler değiştirilecek ve yasaklanmaya neden olabilir.", Color(255, 78, 69, 255), true) -- Create textentry self.textEntry = self.contentFrame:Add("DTextEntry") self:CreateTextEntry(self.textEntry, true, infoText:GetTall(), false, false, false, "Grup adınızı yazınız...") -- Create sign up amount requirement text local yellowText = self.contentFrame:Add("DLabel") self:CreateWarningText(yellowText, "Topluluk oluşturmak için en az 3 oyuncu kaydolmalıdır.") -- Create creation button self.createButton = self.contentFrame:Add("DButton") self:CreateButton(self.createButton, "Grup Oluştur", Color(111, 111, 136, 255), function() if string.utf8len(self.textEntry:GetValue()) <= 2 then LocalPlayer():NotifyLocalized("Grubunuzun adı minimum 3 harf olmalıdır!") return end netstream.Start("ixGroupCreate", self.textEntry:GetValue()) end) end -- The non active waiting for 4 players panel function PANEL:CreateNonActiveGroupPanel(group) self:CreateLogo(0.25) -- Create group title local title = self.contentFrame:Add("DLabel") self:CreateTitleLabel(title, group.name or "error") -- Create pending text local text = self.contentFrame:Add("DLabel") self:CreateLabel(text, "Bu grup hala beklemede, resmi hale gelmesi için daha fazla üyeye ihtiyaç duyuyor.", Color(230, 230, 230, 255)) -- Create text continuation to center properly local text2 = self.contentFrame:Add("DLabel") self:CreateLabel(text2, "Grup resmi hale geldiğinde, grup arayüzüne erişim sağlayacaksınız.", Color(230, 230, 230, 255), false, true) -- Create sign up player requirement text local warning = self.contentFrame:Add("DLabel") self:CreateWarningText(warning, "En az 3 oyuncu kaydolmalıdır grup oluşturmak için.") -- Create acceptance number text local count = group:GetMembersCount() - 1 self.label = self.contentFrame:Add("DLabel") self:CreateWarningText(self.label, count.."/3 oyuncu kabul edildi", true) -- Create leave button self:CreateLeaveButton() end -- The panel when the group is active after inviting 3 players function PANEL:CreateActiveGroupPanel(group, character) local role = group:GetRole(character:GetID()) self.contentFrame.Paint = nil self.groupTitle:SetText(group.name or "error") self.groupTitle:SizeToContents() -- Create left and right panels for main group panel self:CreateActiveGroupMainPanels() -- Create left panel buttons self:CreateLeftSideButtons(group, role, character) end -- Create left and right panels for active group panel function PANEL:CreateActiveGroupMainPanels() self.leftSide = self.contentFrame:Add("Panel") self.leftSide:Dock(LEFT) self.leftSide:SetWide(self.contentFrame:GetWide() * 0.20) self.leftSide:DockMargin(0, 0, self.padding, 0) self.rightSide = self.contentFrame:Add("Panel") self.rightSide:Dock(RIGHT) self.rightSide:SetWide(self.contentFrame:GetWide() * 0.80 - self.padding) end -- Create left side buttons for active group panel function PANEL:CreateLeftSideButtons(group, role, character) self.buttonlist = {} local infoButton = self.leftSide:Add("DButton") self:CreateLeftSideButton(infoButton, "Bilgi", "willardnetworks/tabmenu/group/group_info.png", function() self:CreateRightSideTopBar("willardnetworks/tabmenu/group/group_info.png", "info", function() self.groupUpdater = self:Add("ixGroupUpdater") self.groupUpdater.textEntry:SetText(group.info) self.groupUpdater.callback = function() netstream.Start("ixGroupEditInfo", group:GetID(), self.groupUpdater.textEntry:GetText()) end end, role, {GROUP_LEAD, GROUP_MOD}) self:CreateRightSideMain(group) self:CreateTabLabel(group, group.info) end) if !self.lastSelected then infoButton.DoClick() end local membersButton = self.leftSide:Add("DButton") self:CreateLeftSideButton(membersButton, "Üyeler", "willardnetworks/tabmenu/group/group_members.png", function() self:CreateRightSideTopBar("willardnetworks/tabmenu/group/group_members.png", "members") self:CreateRightSideMain(group, true) self.rightSideMain.Paint = nil self:CreateMembers(role, group, character) end) local loreButton = self.leftSide:Add("DButton") self:CreateLeftSideButton(loreButton, "Hikaye", "willardnetworks/tabmenu/group/group_lore.png", function() self:CreateRightSideTopBar("willardnetworks/tabmenu/group/group_lore.png", "lore", function() self.groupUpdater = self:Add("ixGroupUpdater") self.groupUpdater.textEntry:SetText(group.lore) self.groupUpdater.callback = function() netstream.Start("ixGroupEditLore", group:GetID(), self.groupUpdater.textEntry:GetText()) end end, role, {GROUP_LEAD, GROUP_MOD}) self:CreateRightSideMain(group) self:CreateTabLabel(group, group.lore) end) local forumsButton = self.leftSide:Add("DButton") self:CreateLeftSideButton(forumsButton, "Forum", "willardnetworks/tabmenu/group/group_forums.png", function() self:CreateRightSideTopBar("willardnetworks/tabmenu/group/group_forums.png", "forum link", function() self.groupUpdater = self:Add("ixGroupUpdater") self.groupUpdater.textEntry:SetText(group.forum) self.groupUpdater.callback = function() netstream.Start("ixGroupEditForum", group:GetID(), self.groupUpdater.textEntry:GetText()) end end, role, GROUP_LEAD) self:CreateRightSideMain(group, true, true, true) self:CreateDHTMLPanel(group.forum) end) if role then if role.id then if role.id == GROUP_LEAD then local leaderButton = self.leftSide:Add("DButton") self:CreateLeftSideButton(leaderButton, "Yönetim", "willardnetworks/tabmenu/group/group_lead.png", function() self:CreateRightSideTopBar("willardnetworks/tabmenu/group/group_lead.png", "administration") self:CreateRightSideMain(group, true, true) self:CreateGroupAdminConfigs(role, group, character) end) end end end local leaveButton = self.leftSide:Add("DButton") self:CreateLeftSideButton(leaveButton, "Gruptan Ayrıl", "willardnetworks/tabmenu/group/group_leave.png", function() if role and role.id != GROUP_LEAD then self.groupTitle:SetText("Grup") self.groupTitle:SizeToContents() end netstream.Start("ixGroupLeave") end, true) end -- Helper paint function for outlined rectangles local function PaintStandard(self, w, h, alpha) surface.SetDrawColor(Color(0, 0, 0, alpha)) surface.DrawRect(0, 0, w, h) surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30))) surface.DrawOutlinedRect(0, 0, w, h) end -- A function to create a left side button for active group panel function PANEL:CreateLeftSideButton(parent, text, icon, callback, bLeave) parent:Dock(TOP) parent:SetTall(SScaleMin(35 / 3)) parent:SetText(text) parent:SetFont("MenuFontNoClamp") parent:DockMargin(0, !bLeave and 0 or SScaleMin(12 / 3), 0, SScaleMin(2 / 3)) parent:SetContentAlignment(4) parent:SetTextInset(SScaleMin(40 / 3), 0) parent.icon = icon parent.Paint = function(self, w, h) PaintStandard(self, w, h, 100) surface.SetDrawColor(color_white) surface.SetMaterial(Material(self.icon)) surface.DrawTexturedRect(SScaleMin(14 / 3), parent:GetTall() * 0.5 - SScaleMin(16 / 3) * 0.5, SScaleMin(16 / 3), SScaleMin(16 / 3)) end parent.DoClick = function() surface.PlaySound("helix/ui/press.wav") if !bLeave then self:SetSelected(parent) self.rightSide:Clear() end callback() end table.insert(self.buttonlist, parent) end -- A function to create a DHTML panel function PANEL:CreateDHTMLPanel(link) local html = self.rightSideMain:Add("DHTML") html:Dock(FILL) html:OpenURL(link) end -- A function to set a left side button as selected function PANEL:SetSelected(button) for k, v in pairs(self.buttonlist) do if v != button then v.Paint = function(self, w, h) PaintStandard(self, w, h, 100) surface.SetDrawColor(color_white) surface.SetMaterial(Material(self.icon)) surface.DrawTexturedRect(SScaleMin(14 / 3), button:GetTall() * 0.5 - SScaleMin(16 / 3) * 0.5, SScaleMin(16 / 3), SScaleMin(16 / 3)) end else self.lastSelected = k end end button.Paint = function(self, w, h) surface.SetDrawColor(Color(164, 54, 56, 255)) surface.DrawRect(0, 0, w, h) surface.SetDrawColor(color_white) surface.SetMaterial(Material(self.icon)) surface.DrawTexturedRect(SScaleMin(14 / 3), button:GetTall() * 0.5 - SScaleMin(16 / 3) * 0.5, SScaleMin(16 / 3), SScaleMin(16 / 3)) end end -- Creates a right side panel underneath top bar function PANEL:CreateRightSideMain(group, bNoTitle, bNoScrollPanel, bNoPadding) self.rightSideMain = self.rightSide:Add(!bNoTitle and "Panel" or !bNoScrollPanel and "DScrollPanel" or "Panel") self.rightSideMain:Dock(FILL) if !bNoPadding then self.rightSideMain:DockPadding(50, 30, 50, 50) end self.rightSideMain.Paint = function(self, w, h) PaintFrames(self, w, h) end if !bNoTitle then local title = self.rightSideMain:Add("DLabel") title:Dock(TOP) title:SetContentAlignment(4) title:SetFont("LargerTitlesFontNoClamp") title:SetText(group.name or "error") title:SizeToContents() title:DockMargin(0, 0, 0, SScaleMin(20 / 3)) end end -- Creates the label(s) of the tabs function PANEL:CreateTabLabel(group, label) self.label = self.rightSideMain:Add("DLabel") self.label:SetWrap(true) self.label:SetFont("MenuFontNoClamp") self.label:Dock(TOP) if label == "" or label == nil then self.label:SetText("Burada bir şey yok...") else self.label:SetText(label) end self.label:SetAutoStretchVertical( true ) end -- Creates a right side top bar function PANEL:CreateRightSideTopBar(iconImage, name, editButtonCallback, role, permissions) self.topbar = self.rightSide:Add("Panel") self.topbar:SetTall(SScaleMin(35 / 3)) self.topbar:Dock(TOP) self.topbar:DockMargin(0, 0, 0, SScaleMin(2 / 3)) self.topbar.Paint = function(self, w, h) surface.SetDrawColor(Color(164, 54, 56, 255)) surface.DrawRect(0, 0, w, h) end local icon = self.topbar:Add("DImage") icon:Dock(LEFT) icon:SetWide(SScaleMin(16 / 3)) icon:SetImage(iconImage) icon:DockMargin(SScaleMin(50 / 3), self.topbar:GetTall() * 0.5 - SScaleMin(16 / 3) * 0.5, 0, self.topbar:GetTall() * 0.5 - SScaleMin(16 / 3) * 0.5) local title = self.topbar:Add("DLabel") title:Dock(LEFT) title:DockMargin(SScaleMin(6 / 3), 0, 0, 0) title:SetText(string.utf8upper(name)) title:SetFont("MenuFontBoldNoClamp") title:SizeToContents() local hasAccess = false if permissions then if istable(permissions) then if role then if (role.id == permissions[1] or role.id == permissions[2]) then hasAccess = true end end else if role then if role.id == permissions then hasAccess = true end end end else hasAccess = true end if editButtonCallback and hasAccess then self.topbar.button = self.topbar:Add("DButton") self.topbar.button:Dock(RIGHT) self.topbar.button:SetWide(SScaleMin(100 / 3)) self.topbar.button:SetText("Edit "..name) self.topbar.button:SetFont("MenuFontNoClamp") self.topbar.button:DockMargin(0, SScaleMin(5 / 3), SScaleMin(50 / 3), SScaleMin(5 / 3)) self.topbar.button.Paint = function(self, w, h) PaintStandard(self, w, h, 200) end self.topbar.button.DoClick = function() surface.PlaySound("helix/ui/press.wav") editButtonCallback() end end end local function CreateDivider(parent, bDockLeft) local divider = parent:Add("DShape") divider:SetType("Rect") divider:Dock(bDockLeft and LEFT or RIGHT) divider:SetWide(1) divider:SetColor(Color(111, 111, 136, (255 / 100 * 30))) divider:DockMargin(0, SScaleMin(4 / 3), 0, SScaleMin(4 / 3)) end -- Creates a member row function PANEL:CreateMemberRow(memberData, role, group, character) local row = self.rightSideMain:Add("Panel") row:Dock(TOP) row:SetTall(SScaleMin(50 / 3)) row:DockPadding(SScaleMin(50 / 3), SScaleMin(3 / 3), SScaleMin(50 / 3), SScaleMin(3 / 3)) row.Paint = function(self, w, h) PaintFrames(self, w, h) end local client = !isstring(memberData.player) and memberData.player or false local model, skin = "models/error.mdl", 0 if memberData.id then if ix.char.loaded[memberData.id] then model = ix.char.loaded[memberData.id]:GetModel() skin = ix.char.loaded[memberData.id]:GetData("skin") end end self.icon = row:Add("ixScoreboardIcon") self.icon:Dock(LEFT) self.icon:DockMargin(0, SScaleMin(4 / 3), SScaleMin(10 / 3), SScaleMin(4 / 3)) self.icon:SetWide(self.icon:GetWide() - SScaleMin(8 / 3)) local bRecognize = false local localCharacter = LocalPlayer():GetCharacter() character = player.GetBySteamID64(memberData.steamid) and ix.char.loaded[memberData.id] or "bot" if (localCharacter and !isstring(character)) then bRecognize = localCharacter:DoesRecognize(character:GetID()) end self.icon:SetHidden(!bRecognize) if (!bRecognize) then self.icon.material = ix.util.GetMaterial("willardnetworks/tabmenu/scoreboard/question.png", "smooth nocull") end if (bRecognize and (self.icon:GetModel() != model or self.icon:GetSkin() != skin)) then self.icon:SetModel(model, skin) self.icon:SetTooltip(nil) end if client and ix.char.loaded[memberData.id]:GetData("groups") then for k, v in pairs(ix.char.loaded[memberData.id]:GetData("groups")) do self.icon:SetBodygroup(k, v) end end if (role and (role.id == GROUP_LEAD or role.id == GROUP_MOD)) then self.icon.OnMouseReleased = function(pnl, key) if (key != MOUSE_RIGHT) then return end if (memberData.id == localCharacter:GetID()) then return end if !memberData.role then memberData.role = {} end if !memberData.role.id then memberData.role.id = GROUP_MEMBER end local dmenu = DermaMenu() dmenu:MakePopup() dmenu:SetPos(input.GetCursorPos()) if (memberData.role.id > role.id) then dmenu:AddOption("Kick", function() netstream.Start("ixGroupKick", group.id, memberData.id) end) end local subMenu = dmenu:AddSubMenu("Set Role") for k, v in pairs(group:GetRoles()) do if (role.id == GROUP_LEAD or (role.id == GROUP_MOD and role.id < v.id)) then subMenu:AddOption(v.name, function() netstream.Start("ixGroupSetRole", group.id, memberData.id, v.id) netstream.Start("ixGroupRequestMembers", group:GetID()) self.buttonlist[2].DoClick() end) end end for _, v in pairs(dmenu:GetChildren()[1]:GetChildren()) do if v:GetClassName() == "Label" then v:SetFont("MenuFontNoClamp") end end for _, v in pairs(subMenu:GetChildren()[1]:GetChildren()) do if v:GetClassName() == "Label" then v:SetFont("MenuFontNoClamp") end end end end local namedescPanel = row:Add("Panel") namedescPanel:Dock(FILL) local name = namedescPanel:Add("DLabel") name:Dock(TOP) name:SetFont("MenuFontLargerNoClamp") name:SetContentAlignment(4) name:SetText(memberData.name or "Unknown") name:SizeToContents() name:DockMargin(0, SScaleMin(2 / 3), 0, 0) local description = "Unknown" if !isstring(character) then description = localCharacter:DoesRecognize(character:GetID()) and memberData.description or "Unknown" end local desc = namedescPanel:Add("DLabel") desc:Dock(TOP) desc:SetFont("MenuFontNoClamp") desc:SetTextColor(Color(220, 220, 220, 255)) desc:SetContentAlignment(4) desc:SetText(description) desc:SizeToContents() local steamImage = row:Add("AvatarImage") steamImage:Dock(RIGHT) steamImage:SetWide(SScaleMin(36 / 3)) steamImage:DockMargin(SScaleMin(10 / 3), SScaleMin(4 / 3), 0, SScaleMin(4 / 3)) steamImage.OnMouseReleased = function(pnl, key) if (key != MOUSE_RIGHT) then return end if (!client) then return end local menu = DermaMenu() menu:AddOption(L("viewProfile"), function() local url = "http://steamcommunity.com/profiles/"..memberData.steamid gui.OpenURL(url) end) menu:AddOption(L("copySteamID"), function() SetClipboardText(client:IsBot() and client:EntIndex() or memberData.steamid) end) menu:Open() for _, v in pairs(menu:GetChildren()[1]:GetChildren()) do if v:GetClassName() == "Label" then v:SetFont("MenuFontNoClamp") end end end steamImage:SetSteamID( memberData.steamid, 54 ) steamworks.RequestPlayerInfo( memberData.steamid, function(steamName) local steamname = row:Add("DLabel") steamname:SetText(steamName) steamname:Dock(RIGHT) steamname:SetFont("MenuFontNoClamp") steamname:SizeToContents() steamname:DockMargin(SScaleMin(10 / 3), 0, 0, 0) end) CreateDivider(row) local role = row:Add("DLabel") role:SetText(memberData.role and memberData.role.name or group:GetRoleData(GROUP_MEMBER).name) role:Dock(RIGHT) role:SetFont("MenuFontNoClamp") role:SizeToContents() role:DockMargin(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), 0) CreateDivider(row) local lastOnline = !memberData.online and os.date("%d.%m.%Y", memberData.last_join_time) or "N/A" local lastOnlineLabel = row:Add("DLabel") lastOnlineLabel:SetText(memberData.online and "Online" or lastOnline) lastOnlineLabel:Dock(RIGHT) lastOnlineLabel:SetFont("MenuFontNoClamp") lastOnlineLabel:SizeToContents() lastOnlineLabel:DockMargin(0, 0, SScaleMin(10 / 3), 0) end -- Create members function function PANEL:CreateMembers(role, group, character) if (self.receivedMembers) then for k, v in pairs(self.receivedMembers) do self:CreateMemberRow(v, role, group, character) end else netstream.Start("ixGroupRequestMembers", group:GetID()) end end -- A function to create an admin config row function PANEL:CreateAdminConfigRow(labelText, currentConfig, callback, bColor, group, bRole, roleID) local row = bRole and self.rowPanel:Add("Panel") or self.rightSideMain:Add("Panel") row:Dock(TOP) row:SetTall(bRole and SScaleMin(40 / 3) or SScaleMin(50 / 3)) row:DockPadding(0, SScaleMin(5 / 3), 0, SScaleMin(5 / 3)) row:DockMargin(0, 0, 0, bColor and SScaleMin(50 / 3) or SScaleMin(10 / 3)) row.Paint = function(self, w, h) PaintFrames(self, w, h) end local label = row:Add("DLabel") label:Dock(LEFT) label:SetContentAlignment(4) label:SetText(string.utf8upper(labelText)..":") label:SetFont("MenuFontLargerBoldNoFix") label:DockMargin(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), 0) label:SizeToContents() if currentConfig then local currentText = row:Add("DLabel") currentText:Dock(LEFT) currentText:SetContentAlignment(4) currentText:SetText(currentConfig) currentText:SetFont("MenuFontNoClamp") currentText:SetTextColor(Color(220, 220, 220, 255)) currentText:DockMargin(0, 0, SScaleMin(10 / 3), 0) currentText:SizeToContents() end if bColor then local color = row:Add("DShape") color:Dock(LEFT) color:DockMargin(0, SScaleMin(10 / 3), SScaleMin(10 / 3), SScaleMin(10 / 3)) color:SetType("Rect") color:SetWide(SScaleMin(50 / 3)) color:SetColor(group.color) end if roleID and (roleID != GROUP_MOD and roleID != GROUP_LEAD) then local delete = row:Add("DImageButton") delete:Dock(RIGHT) delete:SetImage("willardnetworks/tabmenu/navicons/exit.png") delete:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3)) delete:DockMargin(0, SScaleMin(5 / 3), SScaleMin(10 / 3), SScaleMin(5 / 3)) delete.DoClick = function() surface.PlaySound("helix/ui/press.wav") netstream.Start("ixGroupDeleteRole", group:GetID(), roleID) end end if callback then local rightSideButton = row:Add("DButton") rightSideButton:Dock(RIGHT) rightSideButton:SetWide(bRole and SScaleMin(120 / 3) or SScaleMin(200 / 3)) rightSideButton:SetFont("MenuFontNoClamp") rightSideButton:SetText(bRole and "Rol ismini düzenle" or "Düzenle "..labelText) rightSideButton:DockMargin(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), 0) rightSideButton.Paint = function(self, w, h) PaintStandard(self, w, h, 100) end rightSideButton.DoClick = function() surface.PlaySound("helix/ui/press.wav") callback() end end end -- A function to create the admin configs on the active group panel function PANEL:CreateGroupAdminConfigs(role, group, character) if (role.id == GROUP_LEAD) then self.rowPanel = self.rightSideMain:Add("DScrollPanel") self.rowPanel:Dock(FILL) self:CreateAdminConfigRow("group name", group.name, function() Derma_StringRequest("Edit Group Name", "Enter group name", group.name, function(text) netstream.Start("ixGroupEditName", group:GetID(), text) end) end) self:CreateAdminConfigRow("group color", nil, function() self.colorMixer = self:Add("ixSettingsRowColorPicker") self.colorMixer:SetPos(gui.MousePos()) self.colorMixer:SetValue(group.color) self.colorMixer.OnValueChanged = function() netstream.Start("ixGroupEditColor", group:GetID(), self.colorMixer:GetValue()) end end, true, group) local defaultRoles = { [GROUP_LEAD] = true, [GROUP_MOD] = true, [GROUP_MEMBER] = true } for k, v in SortedPairsByMemberValue(group:GetRoles(), "id") do if v.id == GROUP_MEMBER then break end local standard = false local standardName = false if (defaultRoles[v.id]) then standardName = "GROUP MOD" if v.id == GROUP_LEAD then standardName = "GROUP LEAD" end standard = true end self:CreateAdminConfigRow(standard and standardName or "ROLE #"..v.id, v.name, function() Derma_StringRequest("İsmi Düzenle", "İsim gir", v.name, function(text) netstream.Start("ixGroupEditRoleName", group:GetID(), v.id, text) end) end, false, group, true, v.id) end local bottomPanel = self.rightSideMain:Add("Panel") bottomPanel:Dock(BOTTOM) bottomPanel:SetTall(SScaleMin(30 / 3)) bottomPanel:DockMargin(0, SScaleMin(10 / 3), 0, 0) self.addRole = bottomPanel:Add("DButton") self.addRole:SetText("Add Role") self.addRole:SetFont("MenuFontNoClamp") self.addRole:Dock(LEFT) self.addRole:SetSize(SScaleMin(80 / 3), SScaleMin(30 / 3)) self.addRole.Paint = function(self, w, h) PaintStandard(self, w, h, 100) end self.addRole.DoClick = function(btn) surface.PlaySound("helix/ui/press.wav") netstream.Start("ixGroupAddRole", group:GetID()) end self.deleteGroup = bottomPanel:Add("DButton") self.deleteGroup:SetText("Delete Group") self.deleteGroup:Dock(RIGHT) self.deleteGroup:SetFont("MenuFontNoClamp") self.deleteGroup:SetWide(SScaleMin(110 / 3)) self.deleteGroup:DockMargin(SScaleMin(10 / 3), 0, 0, 0) self.deleteGroup.DoClick = function(btn) surface.PlaySound("helix/ui/press.wav") Derma_Query("Bu grubu silmek istediğine emin misin?", "Grup Silme", "Evet", function() netstream.Start("ixGroupDelete", group:GetID()) end, "Hayır") end self.deleteGroup.Paint = function(self, w, h) PaintStandard(self, w, h, 100) end self.hidden = bottomPanel:Add("DCheckBoxLabel") self.hidden:SetText("Hide separate scoreboard tab") self.hidden:SetFont("MenuFontNoClamp") self.hidden:Dock(RIGHT) self.hidden:SetWide(SScaleMin(230 / 3)) self.hidden:SetValue(group.hidden) self.hidden.OnChange = function(checkbox, value) netstream.Start("ixGroupHidden", group:GetID(), value) end self.hidden.PerformLayout = function(self) local x = self.m_iIndent || 0 self.Button:SetSize( SScaleMin(15 / 3), SScaleMin(15 / 3) ) self.Button:SetPos( x, math.floor( ( self:GetTall() - self.Button:GetTall() ) / 2 ) ) self.Label:SizeToContents() self.Label:SetPos( x + self.Button:GetWide() + SScaleMin(9 / 3), SScaleMin(5 / 3) ) end end end -- Misc helper functions -- A function to create a leave button function PANEL:CreateLeaveButton() self.leaveButton = self.contentFrame:Add("DButton") self:CreateButton(self.leaveButton, "Gruptan ayrıl", Color(205, 114, 114, 255), function() netstream.Start("ixGroupLeave") end) end -- Creates a text entry function PANEL:CreateTextEntry(parent, bDockTop, height, bMultiline, bScrollbar, bEnter, placeholderText) parent:SetPlaceholderText(placeholderText) parent:Dock(TOP) parent:SetTall(height) parent:SetMultiline( bMultiline ) parent:SetVerticalScrollbarEnabled( bScrollbar ) parent:SetEnterAllowed( bEnter ) parent:SetTextColor(Color(200, 200, 200, 255)) parent:SetCursorColor(Color(200, 200, 200, 255)) parent:SetFont("MenuFontNoClamp") parent:SetPlaceholderColor( Color(200, 200, 200, 200) ) if bDockTop then parent:DockMargin(self.contentFrame:GetWide() * 0.4, 0, self.contentFrame:GetWide() * 0.4, 0) end parent.Paint = function(self, w, h) if bMultiline then surface.SetDrawColor(Color(25, 25, 25, 255)) else surface.SetDrawColor(Color(0, 0, 0, 100)) end surface.DrawRect(0, 0, w, h) surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30))) surface.DrawOutlinedRect(0, 0, w, h) if ( self.GetPlaceholderText && self.GetPlaceholderColor && self:GetPlaceholderText() && self:GetPlaceholderText():Trim() != "" && self:GetPlaceholderColor() && ( !self:GetText() || self:GetText() == "" ) ) then local oldText = self:GetText() local str = self:GetPlaceholderText() if ( str:StartWith( "#" ) ) then str = str:utf8sub( 2 ) end str = language.GetPhrase( str ) self:SetText( str ) self:DrawTextEntryText( self:GetPlaceholderColor(), self:GetHighlightColor(), self:GetCursorColor() ) self:SetText( oldText ) return end self:DrawTextEntryText( self:GetTextColor(), self:GetHighlightColor(), self:GetCursorColor() ) end end -- A function to create a label function PANEL:CreateLabel(parent, text, color, bDoublePadding, bNoPadding) parent:SetText(text) parent:SetFont("MenuFontNoClamp") parent:SetTextColor(color) parent:SizeToContents() parent:SetContentAlignment(5) if bNoPadding then parent:DockMargin(0, 0 - SScaleMin(15 / 3), 0, 0) else parent:DockMargin(0, 0, 0, bDoublePadding and (self.padding * 2) or self.padding) end parent:Dock(TOP) end -- A function to create the menu logo in frame function PANEL:CreateLogo(topMarginMultiplier) local logoPanel = self.contentFrame:Add("Panel") logoPanel:Dock(TOP) logoPanel:SetTall(SScaleMin(17 / 3)) logoPanel:DockMargin(0, self.contentFrame:GetTall() * topMarginMultiplier, 0, self.padding) local logo = logoPanel:Add("DImage") logo:SetSize(SScaleMin(23 / 3), SScaleMin(17 / 3)) logo:SetPos(self.contentFrame:GetWide() * 0.5 - logo:GetWide() * 0.5, 0) logo:SetImage("willardnetworks/tabmenu/charmenu/faction.png") end -- A function to create primary titles function PANEL:CreateTitleLabel(parent, text) parent:SetFont("LargerTitlesFontNoClamp") parent:Dock(TOP) parent:SetText(text) parent:SizeToContents() parent:SetContentAlignment(5) parent:DockMargin(0, 0, 0, self.padding) end -- A function to create yellow "warning" text function PANEL:CreateWarningText(parent, text, bBold) parent:SetText(text) parent:SetFont(bBold and "WNBackFontBoldNoClamp" or "WNBackFontNoClamp") parent:SizeToContents() parent:SetTextColor(Color(255, 204, 0, 255)) parent:Dock(TOP) parent:DockMargin(0, self.padding * 2, 0, 0) parent:SetContentAlignment(5) end -- A function to create a button function PANEL:CreateButton(parent, text, outlineColor, callback) parent:SetText(text) parent:Dock(TOP) parent:SetTall(SScaleMin(25 / 3)) parent:DockMargin(self.contentFrame:GetWide() * 0.45, self.padding * 2, self.contentFrame:GetWide() * 0.45, 0) parent:SetFont("WNBackFontNoClamp") parent:SetContentAlignment(5) parent.Paint = function(self, w, h) surface.SetDrawColor(Color(0, 0, 0, 100)) surface.DrawRect(0, 0, w, h) surface.SetDrawColor(ColorAlpha(outlineColor, (255 / 100 * 30))) surface.DrawOutlinedRect(0, 0, w, h) end parent.DoClick = function(btn) surface.PlaySound("helix/ui/press.wav") if callback then callback() end end end vgui.Register("ixGroup", PANEL, "EditablePanel") -- Group invite panel local PANEL = {} function PANEL:Init() self:SetSize(SScaleMin(550 / 3), SScaleMin(250 / 3)) self:Center() self:SetAlpha(0) self:AlphaTo(255, 0.5, 0) self:MakePopup() self.Paint = function(self, w, h) PaintFrames(self, w, h, true) end timer.Simple(0.25, function() self.nameText = self.nameText or "error" self.whoInvited = self.whoInvited or "error" self.groupID = self.groupID or LocalPlayer():NotifyLocalized("error") local title = self:Add("DLabel") self:CreateLabel(title, "LargerTitlesFontFixed", color_white, string.utf8upper("group invitation"), true) local name = self:Add("DLabel") self:CreateLabel(name, "TitlesFontFixed", Color(230, 230, 230, 255), "'"..self.nameText.."'") local whoInvited = self:Add("DLabel") self:CreateLabel(whoInvited, "MenuFontFixed", Color(230, 230, 230, 255), "Davet eden: "..self.whoInvited) local buttonPanel = self:Add("Panel") buttonPanel:Dock(TOP) buttonPanel:DockMargin(self:GetWide() * 0.5 - (SScaleMin(80 / 3) + SScaleMin(10 / 3)), SScaleMin(20 / 3), self:GetWide() * 0.5 - (SScaleMin(80 / 3) + SScaleMin(10 / 3)), 0) buttonPanel:SetTall(SScaleMin(30 / 3)) local accept = buttonPanel:Add("DButton") self:CreateButton(accept, "Kabul Et", Color(96, 125, 68, 255), true, function() netstream.Start("ixGroupInvite", self.groupID) self:Remove() end) local decline = buttonPanel:Add("DButton") self:CreateButton(decline, "Reddet", Color(125, 68, 68, 255), false, function() self:Remove() end) end) end function PANEL:CreateLabel(parent, font, color, text, bFirstLabel) parent:Dock(TOP) parent:DockMargin(0, bFirstLabel and SScaleMin(40 / 3) or SScaleMin(20 / 3), 0, 0) parent:SetText(text) parent:SetFont(font) parent:SetTextColor(color) parent:SizeToContents() parent:SetContentAlignment(5) end function PANEL:CreateButton(parent, text, color, bDockLeft, callback) parent:Dock(bDockLeft and LEFT or RIGHT) parent:SetText(text) parent:SetWide(SScaleMin(80 / 3)) parent:SetFont("MenuFontNoClamp") parent.Paint = function(self, w, h) surface.SetDrawColor(Color(0, 0, 0, 100)) surface.DrawRect(0, 0, w, h) surface.SetDrawColor(color) surface.DrawOutlinedRect(0, 0, w, h) end parent.DoClick = function() surface.PlaySound("helix/ui/press.wav") callback() end end vgui.Register("ixGroupInvite", PANEL, "EditablePanel") local PANEL = {} function PANEL:Init() self:SetSize(SScaleMin(550 / 3), SScaleMin(550 / 3)) self:Center() self:MakePopup() self.Paint = function(self, w, h) PaintFrames(self, w, h, 255) end local title = self:Add("DLabel") title:SetFont("LargerTitlesFontNoClamp") title:SetText("Update Content") title:SizeToContents() title:SetPos(SScaleMin(20 / 3), SScaleMin(40 / 3) * 0.5 - title:GetTall() * 0.5) local close = self:Add("DImageButton") close:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3)) close:SetPos(self:GetWide() - close:GetWide() - SScaleMin(10 / 3), SScaleMin(10 / 3)) close:SetImage("willardnetworks/tabmenu/navicons/exit.png") close.DoClick = function() surface.PlaySound("helix/ui/press.wav") self:Remove() end local parent = self:GetParent() self.textEntry = self:Add("DTextEntry") if parent.CreateTextEntry then parent:CreateTextEntry(self.textEntry, false, 0, true, true, true, "Güncel içeriğinizi buraya yazın...") end self.textEntry:Dock(FILL) self.textEntry:DockMargin(0, SScaleMin(40 / 3), 0, 0) local save = self:Add("DButton") save:Dock(BOTTOM) save:SetTall(SScaleMin(50 / 3)) save:SetText("Save") save:SetFont("LargerTitlesFontNoClamp") save.Paint = nil save.DoClick = function() self.callback() timer.Simple(0.1, function() if parent.lastSelected then for k, v in pairs(parent.buttonlist) do if k == parent.lastSelected then v.DoClick() end end end end) self:Remove() end end function PANEL:Think() if !IsValid(ix.gui.group) then self:Remove() end self:MoveToFront() end vgui.Register("ixGroupUpdater", PANEL, "EditablePanel")