--[[ | 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 PANEL = {} local padding = SScaleMin(10 / 3) local function Paint(self, w, h) surface.SetDrawColor(Color(0, 0, 0, 100)) surface.DrawRect(0, 0, w, h) surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30))) surface.DrawOutlinedRect(0, 0, w, h) end function PANEL:CustomInit(target) self:SetSize(ScrW(), ScrH()) local background = self:Add("Panel") background:SetSize(self:GetSize()) background.Paint = function(this, w, h) surface.SetDrawColor(Color(63, 58, 115, 220)) surface.DrawRect(0, 0, w, h) Derma_DrawBackgroundBlur( this, 1 ) end self.innerContent = background:Add("EditablePanel") self.innerContent:SetSize(SScaleMin(1300 / 3), SScaleMin(900 / 3)) self.innerContent:Center() self.innerContent:MakePopup() self.innerContent.Paint = function(this, w, h) surface.SetDrawColor(0, 0, 0, 130) surface.DrawRect(0, 0, w, h) end Schema:AllowMessage(self.innerContent) self:DrawTopBar() self:DrawModel() self:DrawLeftSide() end function PANEL:DrawTopBar() local topbar = self.innerContent:Add("Panel") topbar:SetSize(self.innerContent:GetWide(), SScaleMin(50 / 3)) topbar:Dock(TOP) topbar.Paint = function( this, w, h ) surface.SetDrawColor(0, 0, 0, 130) surface.DrawRect(0, 0, w, h) end local titleText = topbar:Add("DLabel") titleText:SetFont("CharCreationBoldTitleNoClamp") titleText:Dock(LEFT) titleText:SetText("Stylizacja włosów/brody") titleText:DockMargin(SScaleMin(10 / 3), 0, 0, 0) titleText:SetContentAlignment(4) titleText:SizeToContents() local exit = topbar:Add("DImageButton") exit:SetImage("willardnetworks/tabmenu/navicons/exit.png") exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3)) exit:DockMargin(0, SScaleMin(15 / 3), SScaleMin(10 / 3), SScaleMin(15 / 3)) exit:Dock(RIGHT) exit.DoClick = function() self:Remove() surface.PlaySound("helix/ui/press.wav") end end function PANEL:DrawModel() local target = self.target or LocalPlayer() local characterModelList = self.innerContent:Add("Panel") characterModelList:Dock(RIGHT) characterModelList:SetWide(self.innerContent:GetWide() * 0.5) characterModelList.Paint = function(this, w, h) surface.SetDrawColor(Color(255, 255, 255, 30)); surface.DrawOutlinedRect(0, 0, w, h) end local imgBackground = characterModelList:Add("DImage") imgBackground:SetImage(ix.faction.indices[target:Team()].inventoryImage or "materials/willardnetworks/tabmenu/inventory/backgrounds/street.png") imgBackground:SetKeepAspect(true) imgBackground:Dock(FILL) imgBackground:DockMargin(1, 1, 1, 1) self.characterModel = imgBackground:Add("ixModelPanel") self.characterModel:Dock(FILL) local styleButton = characterModelList:Add("DButton") styleButton:Dock(BOTTOM) styleButton:SetFont("MenuFontLargerBoldNoFix") styleButton:SetText("Stylizuj") styleButton:SetTall(SScaleMin(50 / 3)) styleButton.DoClick = function() surface.PlaySound("helix/ui/press.wav") local char = target.GetCharacter and target:GetCharacter() local hairBG = target:FindBodygroupByName("hair") local beard = target:FindBodygroupByName("beard") local curHair = target:GetBodygroup(hairBG) local curBeard = target:GetBodygroup(beard) local newHair = self.characterModel.Entity:GetBodygroup(hairBG) local newBeard = self.characterModel.Entity:GetBodygroup(beard) local curHairColor = char and char.GetHair and char:GetHair() and char:GetHair().color or color_white local newHairColor = self.hairColor if (curHair != newHair) or (curBeard != newBeard) or (curHairColor and newHairColor and curHairColor != newHairColor) then netstream.Start("SetHairBeardBodygroup", newHair, newBeard, newHairColor, target) target:NotifyLocalized("Pomyślnie wystylizowałeś swoją brodę/włosy.") self:Remove() else target:NotifyLocalized("Nie możesz wybrać tych samych włosów/brody, jakie już masz!") end end styleButton.Paint = function(this, w, h) Paint(this, w, h) end self:SetCharacter() local bone = self.characterModel.Entity:LookupBone("ValveBiped.Bip01_Head1") if bone then local eyepos = self.characterModel.Entity:GetBonePosition( bone ) self.characterModel:SetLookAt(eyepos) self.characterModel:SetCamPos(eyepos-Vector(-12, -12, 0)) -- Move cam in front of eyes self.characterModel:SetFOV(60) self.characterModel.PaintModel = self.characterModel.Paint end end function PANEL:SetCharacter() local target = self.target or LocalPlayer() local model = target:GetModel() self.characterModel:SetModel(model, target:GetSkin(), true) local isCP = model:find("wn7new") local indexName = isCP and "cp_Head" or "headwear" local index = target:FindBodygroupByName(indexName) if index != -1 then if self.characterModel.Entity:GetBodygroup(index) > 0 then self.characterModel.Entity:SetBodygroup(index, 0) end end local curHair = target:GetCharacter():GetHair() local hairValue = curHair and curHair.hair if hairValue then local hairIndex = target:FindBodygroupByName("hair") self.characterModel.Entity:SetBodygroup(hairIndex, hairValue) end end function PANEL:DrawLeftSide() self.leftSide = self.innerContent:Add("Panel") self.leftSide:Dock(LEFT) self.leftSide:SetWide(self.innerContent:GetWide() * 0.5) self.leftSide.Paint = function(this, w, h) surface.SetDrawColor(Color(255, 255, 255, 10)); surface.DrawRect(0, 0, w, h ) surface.SetDrawColor(Color(255, 255, 255, 30)); surface.DrawOutlinedRect(0, 0, w + 1, h) end self:DrawShaveTrimButtons() local beardBodygroup = self.characterModel.Entity:GetBodygroup(11) local beardPart = self.leftSide:Add("DScrollPanel") beardPart:Dock(BOTTOM) beardPart:SetTall((beardBodygroup != 5 and beardBodygroup != 8 and SScaleMin(100 / 3)) or (self.innerContent:GetTall() - SScaleMin(50 / 3)) * 0.5) beardPart.Paint = function(this, w, h) surface.SetDrawColor(color_white) surface.DrawRect(0, 0, w, 1) end beardPart:DockMargin(0, padding * 3 - 1, 0, 0) local hairParts = self.leftSide:Add("Panel") hairParts:Dock(FILL) local hairPart = hairParts:Add("DScrollPanel") hairPart:Dock(LEFT) hairPart:SetWide(self.innerContent:GetWide() * 0.25) local hairColorPart = hairParts:Add("DScrollPanel") hairColorPart:Dock(FILL) local titleText = hairPart:Add("DLabel") titleText:SetFont("CharCreationBoldTitleNoClamp") titleText:Dock(TOP) titleText:SetText("Włosy") titleText:DockMargin(0, padding * 3 - 1, 0, 0) titleText:SetContentAlignment(5) titleText:SizeToContents() local titleText2 = hairColorPart:Add("DLabel") titleText2:SetFont("CharCreationBoldTitleNoClamp") titleText2:Dock(TOP) titleText2:SetText("Kolor włosów") titleText2:DockMargin(0, padding * 3 - 1, 0, 0) titleText2:SetContentAlignment(5) titleText2:SizeToContents() self:DrawHairButtons(hairPart, hairColorPart) if beardBodygroup == 5 or beardBodygroup == 8 then self:DrawBeardButtons(beardPart) else local notEnough = beardPart:Add("DLabel") notEnough:SetText("Masz zbyt krótki zarost do stylizacji...") notEnough:SetFont("MenuFontLargerBoldNoFix") notEnough:SetContentAlignment(5) notEnough:Dock(TOP) notEnough:DockMargin(0, padding * 3 - 1, 0, 0) end end function PANEL:DrawBeardButtons(beardPart) local target = self.target or LocalPlayer() for i = 1, 6 do local beardButton = beardPart:Add("DButton") local sideMargins = self.leftSide:GetWide() * 0.1 beardButton:Dock(TOP) beardButton:SetTall(SScaleMin(50 / 3)) beardButton:SetFont("MenuFontLargerBoldNoFix") beardButton:SetText("Styl "..i) beardButton:DockMargin(sideMargins, padding * 3 - 1, sideMargins, 0) beardButton.DoClick = function() surface.PlaySound("helix/ui/press.wav") local beard = target:FindBodygroupByName("beard") if i == 5 then self.characterModel.Entity:SetBodygroup(beard, 6) elseif i == 6 then self.characterModel.Entity:SetBodygroup(beard, 7) else self.characterModel.Entity:SetBodygroup(beard, i) end end beardButton.OnCursorEntered = function() surface.PlaySound("helix/ui/rollover.wav") end beardButton.Paint = function(this, w, h) Paint(this, w, h) end end end function PANEL:DrawHairButtons(hairPart, hairColorPart) local target = self.target or LocalPlayer() local gender = target.GetCharacter and target:GetCharacter():GetGender() or "female" local hairs = {} for i = 0, gender == "female" and 14 or 12 do hairs[#hairs + 1] = i end local curStyle = 0 for _, hairID in pairs(hairs) do curStyle = curStyle + 1 local hairButton = hairPart:Add("DButton") local sideMargins = self.leftSide:GetWide() * 0.1 hairButton:Dock(TOP) hairButton:SetTall(SScaleMin(50 / 3)) hairButton:SetFont("MenuFontLargerBoldNoFix") hairButton:SetText("Styl "..curStyle) hairButton:DockMargin(sideMargins, padding * 3 - 1, sideMargins, 0) hairButton.DoClick = function() local hairBG = target:FindBodygroupByName("hair") surface.PlaySound("helix/ui/press.wav") self.characterModel.Entity:SetBodygroup(hairBG, hairID) end hairButton.OnCursorEntered = function() surface.PlaySound("helix/ui/rollover.wav") end hairButton.Paint = function(this, w, h) Paint(this, w, h) end end for _, colorTable in pairs(ix.allowedHairColors) do for _, color in pairs(colorTable) do local hairButton = hairColorPart:Add("DButton") local sideMargins = self.leftSide:GetWide() * 0.1 hairButton:Dock(TOP) hairButton:SetTall(SScaleMin(50 / 3)) hairButton:SetFont("MenuFontLargerBoldNoFix") hairButton:SetText("") hairButton:DockMargin(sideMargins, padding * 3 - 1, sideMargins, 0) hairButton.DoClick = function() surface.PlaySound("helix/ui/press.wav") if self.characterModel and IsValid(self.characterModel) then self.characterModel.overrideProxyColors = {HairColor = Vector(color.r / 255, color.g / 255, color.b / 255)} end self.hairColor = color end hairButton.OnCursorEntered = function() surface.PlaySound("helix/ui/rollover.wav") end hairButton.Paint = function(this, w, h) surface.SetDrawColor(color) surface.DrawRect(0, 0, w, h) end end end end function PANEL:DrawShaveTrimButtons() local target = self.target or LocalPlayer() local buttonPanel = self.leftSide:Add("Panel") buttonPanel:Dock(BOTTOM) buttonPanel:SetTall(SScaleMin(50 / 3)) local shaveButton = buttonPanel:Add("DButton") shaveButton:Dock(FILL) shaveButton:SetText("Ogól") shaveButton:SetFont("MenuFontLargerBoldNoFix") shaveButton:SetWide(self.leftSide:GetWide() * 0.5) shaveButton.DoClick = function() surface.PlaySound("willardnetworks/charactercreation/boop1.wav") self:CreateWarningPanel() end local gender = target.GetCharacter and target:GetCharacter():GetGender() or "female" if gender == "female" then shaveButton:SetDisabled(true) end shaveButton.Paint = function(this, w, h) if gender == "female" then surface.SetDrawColor(255, 255, 255, 5) surface.DrawRect(0, 0, w, h) return end Paint(this, w, h) end local beardBodygroup = self.characterModel.Entity:GetBodygroup(11) if beardBodygroup == 0 then shaveButton:SetDisabled(true) shaveButton.Paint = function(this, w, h) surface.SetDrawColor(255, 255, 255, 5) surface.DrawRect(0, 0, w, h) end shaveButton.OnCursorEntered = function() end end end function PANEL:CreateWarningPanel() local warningPanel = vgui.Create("Panel") warningPanel:SetAlpha(0) warningPanel:MakePopup() warningPanel:SetSize(ScrW(), ScrH()) warningPanel:AlphaTo(255, 0.5, 0) warningPanel.Paint = function(this, w, h) surface.SetDrawColor(0, 0, 0, 230) surface.DrawRect(0, 0, w, h) end local warningContent = warningPanel:Add("Panel") warningContent:SetSize(ScrW() * 0.4, SScaleMin(95 / 3)) warningContent:Center() local label = warningContent:Add("DLabel") label:SetFont("CharCreationBoldTitleNoClamp") label:SetText("Ta akcja usunie twój zarost, czy jesteś pewien?") label:SetContentAlignment(5) label:Dock(TOP) label:SizeToContents() local warningButtons = warningContent:Add("Panel") warningButtons:Dock(TOP) warningButtons:DockMargin(0, padding, 0, 0) warningButtons:SetTall(SScaleMin(50 / 3)) local yes = warningButtons:Add("DButton") yes:Dock(LEFT) yes:SetWide(warningContent:GetWide() * 0.5) yes:SetText("TAK") yes:SetFont("CharCreationBoldTitleNoClamp") yes:SetContentAlignment(6) yes:SetTextColor(Color(200, 200, 200, 255)) yes:SetTextInset(padding * 2, 0) yes.Paint = function(this, w, h) if this:IsHovered() then this:SetTextColor(Color(255, 255, 255, 255)) else this:SetTextColor(Color(200, 200, 200, 255)) end end local target = self.target or LocalPlayer() yes.DoClick = function() surface.PlaySound("helix/ui/press.wav") surface.PlaySound("npc/antlion/idle1.wav") warningPanel:AlphaTo(0, 0.5, 0, function() local beard = target:FindBodygroupByName("beard") warningPanel:Remove() self:Remove() netstream.Start("RemoveBeardBodygroup", target) self.characterModel.Entity:SetBodygroup(beard, 0) end) end local no = warningButtons:Add("DButton") no:Dock(RIGHT) no:SetWide(warningContent:GetWide() * 0.5) no:SetText("NIE") no:SetFont("CharCreationBoldTitleNoClamp") no:SetTextColor(Color(200, 200, 200, 255)) no:SetContentAlignment(4) no:SetTextInset(padding * 2, 0) no.Paint = function(this, w, h) if this:IsHovered() then this:SetTextColor(Color(255, 255, 255, 255)) else this:SetTextColor(Color(200, 200, 200, 255)) end end no.DoClick = function() surface.PlaySound("helix/ui/press.wav") warningPanel:AlphaTo(0, 0.5, 0, function() warningPanel:Remove() end) end yes.OnCursorEntered = function() surface.PlaySound("helix/ui/rollover.wav") end no.OnCursorEntered = function() surface.PlaySound("helix/ui/rollover.wav") end end function PANEL:SetTarget(target) self.target = target end vgui.Register("BeardStyling", PANEL, "EditablePanel")