Files
wnsrc/gamemodes/helix/plugins/willardinterface/derma/cl_charcreate.lua

2863 lines
92 KiB
Lua
Raw Normal View History

2024-08-04 23:12:27 +03:00
--[[
| 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/
--]]
DEFINE_BASECLASS("ixCharMenuPanel")
local PANEL = {}
local margin = SScaleMin(20 / 3)
local hMargin = margin * 0.5
local factionImageW = SScaleMin(300 / 3)
local backHeight = SScaleMin(30 / 3)
local padding = SScaleMin(10 / 3)
function PANEL:CreateCharacterCreation()
self.characterPanel = self:AddSubpanel("character")
self.characterPanel:SetTitle("")
self.characterPanel:SetSize(self:GetSize())
self.characterPanel.avoidPadding = true
self.panelCreation = self.characterPanel:Add("Panel")
self.panelCreation:SetSize(SScaleMin(1500 / 3), ScrH())
self.panelCreation:Center()
self:CreateCharacterModel()
self:CreateCreationInner()
end
function PANEL:GetClothing()
self.clothingList = {}
self.ccaClothingList = {}
for _, v in pairs(ix.item.list) do
if v.base != "base_bgclothes" then continue end
if !v.bodyGroups then continue end
if !v.adminCreation and !v.charCreation then continue end
if !v.outfitCategory then continue end
local proxy = v.proxy or {}
if v.outfitCategory == "Torso" and !proxy.TorsoColor then
proxy = {TorsoColor = Vector(255 / 255, 255 / 255, 255 / 255)}
end
if v.outfitCategory == "Legs" and !proxy.PantsColor then
proxy = {PantsColor = Vector(255 / 255, 255 / 255, 255 / 255)}
end
if v.outfitCategory == "Shoes" and !proxy.ShoesColor then
proxy = {ShoesColor = Vector(255 / 255, 255 / 255, 255 / 255)}
end
if v.adminCreation then
self.ccaClothingList[v.name] = {
outfitCategory = v.outfitCategory,
bg = v.bodyGroups[table.GetKeys(v.bodyGroups)[1]],
color = proxy,
uniqueID = v.uniqueID
}
continue
end
if v.charCreation then
self.clothingList[v.name] = {
outfitCategory = v.outfitCategory,
bg = v.bodyGroups[table.GetKeys(v.bodyGroups)[1]],
color = proxy,
uniqueID = v.uniqueID
}
end
end
return self.clothingList, self.ccaClothingList
end
function PANEL:CreateCreationInner()
self.clothingList, self.ccaClothingList = self:GetClothing()
local innerContent = self.panelCreation:Add("Panel")
self.rightCreation = innerContent:Add("Panel")
self.rightCreation:Dock(RIGHT)
self.rightCreation:SetSize(SScaleMin(460 / 3), self.panelCreation:GetTall())
self.rightCreation:DockMargin(margin, 0, 0, 0)
self.leftCreation = innerContent:Add("Panel")
self.leftCreation:Dock(RIGHT)
self.leftCreation:SetSize(SScaleMin(160 / 3), self.panelCreation:GetTall())
innerContent:SetSize(self.rightCreation:GetWide() + self.leftCreation:GetWide() + margin, self.panelCreation:GetTall())
innerContent:Center()
local x, _ = innerContent:GetPos()
innerContent:SetPos(x, ScrH() * 0.5 - SScaleMin(743 / 3) * 0.5 + (SScaleMin(150 / 3) * 0.2))
self.characterModelList:MoveLeftOf(innerContent)
self:CreateCreationTitles()
-- Create Left Menu Buttons
self:CreateCharacterButton()
self:CreateAppearancesButton()
self:CreateHairButton()
self:CreateFaceButton()
if (ix.special) then
self:CreateAttributesButton()
end
if (ix.skill) then
self:CreateSkillsButton()
end
self:CreateBackgroundButton()
end
function PANEL:Init()
self.mainButtonList = {}
self.parent = self:GetParent()
self.WhitelistCount = self:GetWhitelistFactions()
self.randomClickSounds = {
"willardnetworks/charactercreation/boop1.wav",
"willardnetworks/charactercreation/boop2.wav",
"willardnetworks/charactercreation/boop3.wav"
}
self:ResetPanel()
self:CreateFactionSelect()
self:CreateCharacterCreation()
self:CreateBlackBars()
-- creation progress panel
self.progress = self:Add("ixSegmentedProgress")
self.progress:SetBarColor(ix.config.Get("color"))
self.progress:SetSize(self.parent:GetWide(), 0)
self.progress:SetVisible(false)
self.progress:SizeToContents()
self.progress:SetPos(0, self.parent:GetTall() - self.progress:GetTall())
-- setup payload hooks
self:AddPayloadHook("model", function(value)
local faction = ix.faction.indices[self.payload.faction]
if (faction) then
local model
if self.payload.gender == "male" and faction:GetModelsMale(LocalPlayer()) then
model = faction:GetModelsMale(LocalPlayer())[value]
elseif self.payload.gender == "female" and faction:GetModelsFemale(LocalPlayer()) then
model = faction:GetModelsFemale(LocalPlayer())[value]
else
model = faction:GetModels(LocalPlayer())[value]
end
-- assuming bodygroups
if (istable(model)) then
self.characterModel:SetModel(model[1], model[2] or 0, model[3])
else
self.characterModel:SetModel(model or faction:GetModelsFemale(LocalPlayer())[1])
end
if self.characterModel:GetModel():find("models/willardnetworks/citizens/") then
if faction.index == FACTION_CP then
model = self.characterModel:GetModel()
if model then
model = string.Replace(model, "models/willardnetworks/citizens/", "models/wn7new/metropolice/")
self.characterModel:SetModel(model)
end
end
end
end
end)
-- setup character creation hooks
net.Receive("ixCharacterAuthed", function()
timer.Remove("ixCharacterCreateTimeout")
if (IsValid(self)) then
self.awaitingResponse = false
end
local id = net.ReadUInt(32)
local indices = net.ReadUInt(6)
local charList = {}
for _ = 1, indices do
charList[#charList + 1] = net.ReadUInt(32)
end
ix.characters = charList
if (IsValid(self)) then
self:SlideDown()
end
ix.panelCreationActive = false
ix.gui.mapsceneActive = nil
if (!IsValid(self) or !IsValid(self.parent)) then
return
end
if (id) then
self.bMenuShouldClose = true
net.Start("ixCharacterChoose")
net.WriteUInt(id, 32)
net.SendToServer()
else
self:SlideDown()
end
end)
net.Receive("ixCharacterAuthFailed", function()
timer.Remove("ixCharacterCreateTimeout")
self.awaitingResponse = false
local fault = net.ReadString()
local args = net.ReadTable()
self:SlideDown()
self.parent.mainPanel:Undim()
self.parent:ShowNotice(3, L(fault, unpack(args)))
end)
end
function PANEL:SendPayload()
if (self.awaitingResponse or !self:VerifyProgression()) then
return
end
self.awaitingResponse = true
timer.Create("ixCharacterCreateTimeout", 10, 1, function()
if (IsValid(self) and self.awaitingResponse) then
self.awaitingResponse = false
self:SlideDown()
self.parent.mainPanel:Undim()
self.parent:ShowNotice(3, L("unknownError"))
end
end)
if self.payload.Prepare then
self.payload:Prepare()
end
net.Start("ixCharacterCreate")
net.WriteUInt(table.Count(self.payload), 8)
for k, v in pairs(self.payload) do
net.WriteString(k)
net.WriteType(v)
end
net.SendToServer()
end
function PANEL:GetMaxAttributePoints(bSkill)
if bSkill then return 10 end
return hook.Run("GetDefaultAttributePoints", LocalPlayer(), self.payload) or ix.config.Get("maxAttributes", 30)
end
function PANEL:OnSlideUp()
self:ResetPayload()
self:Populate()
self.progress:SetProgress(1)
-- the faction subpanel will skip to next subpanel if there is only one faction to choose from,
-- so we don't have to worry about it here
self:SetActiveSubpanel("faction", 0)
end
function PANEL:OnSlideDown()
end
function PANEL:ResetPayload(bWithHooks)
if (bWithHooks) then
self.hooks = {}
end
self.payload = {}
-- TODO: eh..
function self.payload.Set(payload, key, value)
self:SetPayload(key, value)
end
function self.payload.AddHook(payload, key, callback)
self:AddPayloadHook(key, callback)
end
function self.payload.Prepare(payload)
self.payload.Set = nil
self.payload.AddHook = nil
self.payload.Prepare = nil
end
end
function PANEL:SetPayload(key, value)
self.payload[key] = value
self:RunPayloadHook(key, value)
end
function PANEL:AddPayloadHook(key, callback)
if (!self.hooks[key]) then
self.hooks[key] = {}
end
self.hooks[key][#self.hooks[key] + 1] = callback
end
function PANEL:RunPayloadHook(key, value)
local hooks = self.hooks[key] or {}
for _, v in ipairs(hooks) do
v(value)
end
end
function PANEL:AttachCleanup(panel)
self.repopulatePanels[#self.repopulatePanels + 1] = panel
end
function PANEL:Populate()
-- remove panels created for character vars
for i = 1, #self.repopulatePanels do
self.repopulatePanels[i]:Remove()
end
self.repopulatePanels = {}
-- payload is empty because we attempted to send it - for whatever reason we're back here again so we need to repopulate
if (!self.payload.faction) then
self.payload.faction = FACTION_CITIZEN
end
if (!self.bInitialPopulate) then
-- setup progress bar segments
if self.WhitelistCount > 1 then
self.progress:AddSegment("@faction")
end
self.progress:AddSegment("character")
self.progress:SetVisible(false)
end
self.bInitialPopulate = true
end
function PANEL:VerifyProgression(name)
for k, v in SortedPairsByMemberValue(ix.char.vars, "index") do
if (name ~= nil and (v.category or "character") != name) then
continue
end
local value = self.payload[k]
if (!v.bNoDisplay or v.OnValidate) then
if (v.OnValidate) then
local result = {v:OnValidate(value, self.payload, LocalPlayer())}
if (result[1] == false) then
self:GetParent():ShowNotice(3, L(unpack(result, 2)))
return false
end
end
self.payload[k] = value
end
end
return true
end
-- Faction Stuff
function PANEL:CreateFactionSelect()
self.factionPanel = self:AddSubpanel("faction", true)
self.factionPanel:SetTitle("")
self.factionPanel:SetSize(self.parent:GetSize())
self.factionPanel.avoidPadding = true
self.panelFaction = self.factionPanel:Add("Panel")
self:CreateFactionTitles()
self:CreateFactionsInner()
end
function PANEL:CreateFactionTitles()
self.titleLabel = self.panelFaction:Add("DLabel")
self.titleLabel:SetTextColor(color_white)
self.titleLabel:SetFont("MainMenuNewTitleFont")
self.titleLabel:SetText(string.utf8upper("Frakcje"))
self.titleLabel:SizeToContents()
self.titleLabel:SetContentAlignment(5)
self.titleLabel:Dock(TOP)
self.titleLabel:DockMargin(0, 0, 0, SScaleMin(50 / 3))
end
function PANEL:CreateFactionsInner()
local listHeight = SScaleMin(500 / 3)
local textSize = SScaleMin(70 / 3)
local listAndText = listHeight + textSize
local prevNextW, prevNextH = SScaleMin(32 / 3), SScaleMin(32 / 3)
local panelHeight = self.titleLabel:GetTall() + SScaleMin(50 / 3) + (SScaleMin(20 / 3) * 2) + listAndText + backHeight + margin
local panelLoadWBelowEqual4 = self.WhitelistCount * (factionImageW + margin)
local panelLoad4 = 4 * (factionImageW + margin)
if panelLoadWBelowEqual4 < self.titleLabel:GetWide() then panelLoadWBelowEqual4 = self.titleLabel:GetWide() end
if panelLoad4 < self.titleLabel:GetWide() then panelLoad4 = self.titleLabel:GetWide() end
if self.WhitelistCount >= 1 and self.WhitelistCount <= 4 then
self.panelFaction:SetSize(panelLoadWBelowEqual4, panelHeight)
elseif self.WhitelistCount > 4 then
self.panelFaction:SetSize(panelLoad4, panelHeight)
end
self.panelFaction:Center()
local factionListContent = self.panelFaction:Add("Panel")
factionListContent:SetSize(self.panelFaction:GetWide(), listAndText)
factionListContent:Dock(TOP)
self.factionList = factionListContent:Add("Panel")
self.factionList:SetSize(self.WhitelistCount * (factionImageW + margin), listHeight)
self.textFaction = factionListContent:Add("Panel")
self.textFaction:SetSize(self.WhitelistCount * (factionImageW + margin), textSize)
self.textFaction:SetPos(0, self.factionList:GetTall())
if self.WhitelistCount > 4 then
local nextBut = self.factionPanel:Add("DImageButton")
nextBut:SetSize(prevNextW, prevNextH)
nextBut:SetImage("willardnetworks/charselect/arrow_right.png")
nextBut:Center()
local _, y = nextBut:GetPos()
nextBut:MoveRightOf(self.panelFaction)
local x2, _ = nextBut:GetPos()
nextBut:SetPos(x2 + margin, y)
nextBut.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
nextBut:SetColor( Color( 210, 210, 210, 255 ) )
end
nextBut.OnCursorExited = function()
nextBut:SetColor( color_white )
end
nextBut.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
local x, y2 = self.factionList:GetPos()
local x3, y3 = self.textFaction:GetPos()
local pos1, pos2 = math.Round(math.abs( x )), math.Round(((self.WhitelistCount - 5) * (factionImageW + margin)))
if pos1 == pos2 or math.abs(pos1 - pos2) <= factionImageW - 10 then
nextBut:SetVisible(false)
end
self.factionList:MoveTo( x - (factionImageW + margin), y2, 0.1, 0, 1 )
self.textFaction:MoveTo( x3 - (factionImageW + margin), y3, 0.1, 0, 1 )
if IsValid(self.prevBut) then
return
else
self.prevBut = self.factionPanel:Add("DImageButton")
self.prevBut:SetSize(prevNextW, prevNextH)
self.prevBut:SetImage("willardnetworks/charselect/arrow_left.png")
self.prevBut:Center()
_, y = self.prevBut:GetPos()
self.prevBut:MoveLeftOf(self.panelFaction)
x2, y2 = self.prevBut:GetPos()
self.prevBut:SetPos(x2 - margin, y)
self.prevBut.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
self.prevBut:SetColor( Color( 210, 210, 210, 255 ) )
end
self.prevBut.OnCursorExited = function()
self.prevBut:SetColor( color_white )
end
self.prevBut.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
x, y = self.factionList:GetPos()
x2, y2 = self.textFaction:GetPos()
if IsValid(nextBut) then
nextBut:SetVisible(true)
end
self.factionList:MoveTo( x + (factionImageW + margin), y, 0.1, 0, 1 )
self.textFaction:MoveTo( x2 + (factionImageW + margin), y2, 0.1, 0, 1 )
if IsValid(self.prevBut) then
pos1, pos2 = math.Round(x, 0), math.Round((0 - (factionImageW + margin)), 0)
if pos1 == pos2 or math.abs(pos1 - pos2) <= factionImageW - 10 then
self.prevBut:Remove()
end
end
end
end
end
end
self:CreateActualFactions()
end
function PANEL:CreateActualFactions()
for _, v in SortedPairs(ix.faction.teams) do
if (ix.faction.HasWhitelist(v.index)) then
local factionImage = v.factionImage
local button = self.factionList:Add("DImageButton")
button:SetImage(factionImage or "scripted/breen_fakemonitor_1")
button:Dock(LEFT)
button:DockMargin(hMargin, 0, hMargin, 0)
button:SetSize( factionImageW, self.factionList:GetTall() )
button.faction = v.index
button.PaintOver = function(_, w, h)
surface.SetDrawColor(Color(73, 82, 87, 255))
surface.DrawOutlinedRect(0, 0, w, h)
end
button.Paint = function ( _, w, h )
surface.SetDrawColor(Color(255, 255, 255, 0))
if button:IsHovered() then
button:SetColor( Color( 210, 210, 210, 255 ) )
else
button:SetColor( color_white )
end
end
button.DoClick = function(panel)
surface.PlaySound("helix/ui/press.wav")
self:SetStandardFactionInfo(panel)
self.progress:IncrementProgress()
self:Populate()
self:SetActiveSubpanel("character")
self:CheckIfFinished()
self:FadeInBars()
self.characterButton.DoClick()
ix.panelCreationActive = true
ix.gui.mapsceneActive = self.faction.name
end
button.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
end
end
for _, v in SortedPairs(ix.faction.teams) do
if (ix.faction.HasWhitelist(v.index)) then
local insidePanel = self.textFaction:Add("Panel")
insidePanel:Dock(LEFT)
insidePanel:SetSize(factionImageW, self.textFaction:GetTall())
insidePanel:DockMargin(hMargin, 0, hMargin, 0)
local text = insidePanel:Add("DLabel")
text:SetFont("TitlesFontNoBoldNoClamp")
text:SetText(string.utf8upper(v.name))
text:SizeToContents()
text:Center()
end
end
self:CreateFactionBack()
end
function PANEL:CreateFactionBack()
local parent = self:GetParent()
self.aFontColor = parent.mainPanel.aFontColor or Color(196, 196, 196, 255)
self.aFontHoverColor = parent.mainPanel.aFontHoverColor or Color(255, 255, 255, 255)
self.aFontLockedButtonColor = parent.mainPanel.aFontLockedButtonColor or Color(90, 90, 90, 255)
local backPanel = self.panelFaction:Add("Panel")
backPanel:Dock(TOP)
backPanel:DockMargin(0, SScaleMin(20 / 3) * 2, 0, 0)
backPanel:SetSize(self.panelFaction:GetWide(), SScaleMin(30 / 3))
self.factionBack = backPanel:Add("DButton")
self.factionBack:SetText(string.utf8upper("Powrót"))
self.factionBack:SetContentAlignment(6)
self.factionBack:SetSize(SScaleMin(90 / 3), SScaleMin(30 / 3))
self.factionBack:SetTextColor(self.aFontColor)
self.factionBack:SetFont("MainMenuNewButtonFont")
self.factionBack:SetTextInset(SScaleMin(10 / 3), 0)
self.factionBack:Center()
self.factionBack.Paint = function( this, w, h )
surface.SetDrawColor(Color(255, 255, 255, 255))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/back_arrow.png"))
surface.DrawTexturedRect(SScaleMin(10 / 3), (SScaleMin(30 / 3) * 0.5) - (margin * 0.5), margin, margin)
end
self.factionBack.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
self.factionBack:SetTextColor(self.aFontHoverColor)
end
self.factionBack.OnCursorExited = function()
self.factionBack:SetTextColor(self.aFontColor)
end
self.factionBack.DoClick = function()
self.progress:DecrementProgress()
self:SetActiveSubpanel("faction", 0)
self:SlideDown()
self.parent.mainPanel:Undim()
end
end
-- Creation functions
function PANEL:CreateBlackBar(parent, bDockTop)
parent:SetType( "Rect" )
parent:SetColor( Color(0, 0, 0, 0) )
parent:Dock(bDockTop and TOP or BOTTOM)
parent:SetSize( ScrW(), math.Clamp(VScale(75 / 3), 0, 75) )
end
function PANEL:CreateBlackBars()
ix.gui.blackBarTop = self.characterPanel:Add("DShape")
self:CreateBlackBar(ix.gui.blackBarTop, true)
ix.gui.blackBarBottom = self.characterPanel:Add("DShape")
self:CreateBlackBar(ix.gui.blackBarBottom)
end
-- Character creation stuff
-- A function to create the background button in the main menu
function PANEL:CreateBackgroundButton()
self.backgroundButton = self.leftCreation:Add("DButton")
self:CreateMainButton(self.backgroundButton, "tło postaci", "background")
self.backgroundButton.DoClick = function()
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.backgroundButton, "background", true)
surface.PlaySound(table.Random(self.randomClickSounds))
self:CreateRightMenuTextPanel("wybór tła postaci", 60)
self.backgroundButtonList = {}
if !table.IsEmpty(self.backgroundButtonList) then
table.Empty(self.backgroundButtonList)
end
if self.faction:GetNoBackground(LocalPlayer()) != true then
if self.faction.name == "Obywatel" then
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/relocatedcitizen.png", 45, 61, "Relokowany Obywatel", "Właśnie przybyłeś do nowego nieznanego Ci miasta. Nie masz tutaj żadnej rodziny, żadnych kontaktów, jesteś tylko kolejnym nic nie znaczącym nikim. Wysiadasz z pociągu i rozpoczynasz zupełnie nowe życie.", -5, "Dobre dla nowych graczy")
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Lokalny Obywatel", "Mieszkasz tu od całkiem długiego czasu, może nawet od czasu przed okupacją. Jakimś cudem miałeś te szczęście i nigdy nie zostałeś relokowany. Znasz już to miasto praktycznie na wylot.", 0)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Zwolennik", "Z jakiegoś powodu przystałeś na zwierzchnictwo Kombinatu. Przestrzegasz ich przepisy i starasz sprostać się ich oczekiwaniu. Twoja współpraca może niektórym się nie spodobać.", 0)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/outcast.png", 55, 55, "Wyrzutek", "Zawsze w ruchu i zawsze w cieniu. Żyjesz na własną rękę w najbiedniejszych rejonach miasta, sprawnie unikając ciężkiej ręki Kombinatu.", 5)
elseif self.faction.name == "Vortigaunt" then
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Biotyk", "Zniewolony, uwolniony i ponownie zniewolony. Z obrożą na szyi i pod butem Kombinatu musisz znosić wszelkie ich tortury. Ty i tysiące innych.", 13, "Wybierz tę opcję, chyba że masz pozwolenie na użycie innych teł.")
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Uwolniony", "Niegdyś zniewolony, teraz wolny. Żyłeś pod butem Kombinatu, lecz teraz już się to skończyło. Bądź ostrożny, Kombinat już zasmakował twojej krwi i nie okaże żadnej pobłażliwości, gdy Cię znowu znajdzie...", 13, "Trudny poziom trudności - nie używaj tej opcji, jeśli nie masz pozwolenia.")
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/outcast.png", 55, 55, "Wolny", "Jako jeden z nielicznych vortigauntów nigdy nie zostałeś schwytany przez Kombinat. Ostatni łancuch jaki nosiłeś należał do Nihilantha. Kombinat nie wie o twoim istnieniu.", 15, "Nie używaj tej opcji, jeśli nie masz pozwolenia.", nil, true)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Kolaborator", "Jakimś niewiadomym cudem Kombinatowi udało się złamać twój umysł. Jesteś ich ofiarą, funkcjonujesz jako anomalia dla rasy Vortigauntów. Możesz pozwolić sobie na luksusy podstępnie oferowanie przez Kombinat, masz status Kolaboranta.", 13, "Nie używaj tej opcji, jesli nie masz pozwolenia. To tło zaczyna z CIDem, 50 punktami kohezji, bez kajdan i ładną pracą spodni.", nil, true)
elseif self.faction.name == "Civil Workers Union" then
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/relocatedcitizen.png", 45, 61, "Pracownik", "Jesteś pracownikem dla siły roboczej rządu okupacyjnego Kombinatu. Spędasz swój czas pozbywając się infestacji, w fabryce lub naprawiając infrastrukturę.", -8)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Lekarz", "Jesteś personelem medycznym tego miasta. Twoim zadaniem jest dbanie o zdrowie populacji. Jeśli będziesz miał wystarczająco szczęścia będziesz mógł operować zarówno na vortigauntach, jak i Civil Protection.", -10)
end
else
local backgroundPanel = self.rightCreation:Add("Panel")
backgroundPanel:Dock(TOP)
backgroundPanel:DockMargin(0, 0 - SScaleMin(1 / 3), 0, 0)
backgroundPanel:SetTall(SScaleMin(140 / 3))
backgroundPanel.Paint = function(_, 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
local noBackground = backgroundPanel:Add("DLabel")
noBackground:Dock(FILL)
noBackground:SetFont("MenuFontNoClamp")
noBackground:SetText("Wybór tła nie jest dostępny dla tej frakcji")
noBackground:SetContentAlignment(5)
end
self:CreateFinishPanel(self.skillsButton, false)
end
end
-- A function to create a single attribute in the attribute panel
function PANEL:CreateAttribute(icon, wIcon, hIcon, title, desc, attribute, bSkill, minorBoost, majorBoost)
local attributePanelH = SScaleMin(105 / 3)
local skillDivider = 1.5
hIcon = (bSkill and hIcon / skillDivider) or hIcon
wIcon = (bSkill and wIcon / skillDivider) or wIcon
local attributePanel = self.rightCreation:Add("Panel")
attributePanel:Dock(TOP)
attributePanel:DockMargin(0, 0 - SScaleMin(1 / 3), 0, 0)
attributePanel:SetTall(bSkill and attributePanelH / skillDivider or attributePanelH)
attributePanel.Paint = function(_, 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)
surface.SetDrawColor(color_white)
surface.SetMaterial(Material(icon))
surface.DrawTexturedRect(SScaleMin(90 / 3) * 0.5 - SScaleMin(wIcon / 3) * 0.5, attributePanel:GetTall() * 0.5 - SScaleMin(hIcon / 3) * 0.5, SScaleMin(wIcon / 3), SScaleMin(hIcon / 3))
end
local textPanel = attributePanel:Add("Panel")
textPanel:SetSize(self.rightCreation:GetWide() - (SScaleMin(50 / 3) + SScaleMin(wIcon / 3)) - (SScaleMin(15 / 3) + SScaleMin(50 / 3)), attributePanel:GetTall())
textPanel:SetPos(SScaleMin(90 / 3), 0)
local minorAttBoostSkill
local majorAttBoostSkill
local attBoostSum = false
if bSkill then
minorAttBoostSkill = (minorBoost.skills[attribute] * self.payload.special[minorBoost.uniqueID])
majorAttBoostSkill = (majorBoost.skills[attribute] * self.payload.special[majorBoost.uniqueID])
attBoostSum = minorAttBoostSkill + majorAttBoostSkill
end
local titleTextPanel = textPanel:Add("Panel")
titleTextPanel:Dock(TOP)
local titleText = titleTextPanel:Add("DLabel")
titleText:SetText(string.utf8upper(title))
titleText:SetFont("LargerTitlesFontNoClamp")
titleText:SizeToContents()
titleText:Dock(LEFT)
titleText:SetTextColor(Color(255, 204, 0, 255))
if (bSkill) then
local boostedLevels = titleTextPanel:Add("DLabel")
boostedLevels:Dock(FILL)
boostedLevels:SetContentAlignment(4)
boostedLevels:SetFont("MenuFontLargerBoldNoFix")
boostedLevels:SetTextColor(Color(75, 238, 75))
boostedLevels:SetText("Poziomy: +"..attBoostSum)
boostedLevels:DockMargin(SScaleMin(10 / 3), 0, 0, 0)
boostedLevels:SizeToContents()
end
titleTextPanel:SetSize(titleText:GetSize())
local descText = textPanel:Add("DLabel")
descText:SetText(desc)
descText:SetFont("SmallerTitleFontNoBoldNoClamp")
descText:SetWrap(true)
descText:SetAutoStretchVertical(true)
descText:Dock(TOP)
textPanel.Paint = function(this, w, h)
this:SetSize(this:GetWide(), titleText:GetTall() + descText:GetTall())
this:Center()
local _, y = this:GetPos()
this:SetPos(SScaleMin(90 / 3), y - SScaleMin(2 / 3))
end
local attributePointsPanel = attributePanel:Add("Panel")
attributePointsPanel:Dock(RIGHT)
attributePointsPanel:DockMargin(0, 0, SScaleMin(25 / 3), 0)
attributePointsPanel:SetSize(SScaleMin(30 / 3), attributePanel:GetTall())
local upArrow = attributePointsPanel:Add("DImageButton")
upArrow:Dock(TOP)
upArrow:SetTall(SScaleMin(9 / 3))
upArrow:SetImage("willardnetworks/mainmenu/charcreation/uparrow.png")
local attributePoint = attributePointsPanel:Add("DLabel")
attributePoint:SetFont("LargerTitlesFontNoClamp")
attributePoint:Dock(TOP)
attributePoint:SetText(bSkill and (self.payload.skill[attribute] or "0") or (self.payload.special[attribute] or "0"))
attributePoint:SetContentAlignment(5)
attributePoint:SizeToContents()
local diff = (-SScaleMin(15 / 3) + attributePointsPanel:GetWide()) / 2
local downArrow = attributePointsPanel:Add("DImageButton")
downArrow:Dock(TOP)
downArrow:DockMargin(diff, SScaleMin(5 / 3), diff, 0)
downArrow:SetTall(SScaleMin(9 / 3))
downArrow:SetImage("willardnetworks/mainmenu/charcreation/downarrow.png")
upArrow:DockMargin(diff, attributePointsPanel:GetTall() * 0.5 - upArrow:GetTall() * 0.5 - attributePoint:GetTall() * 0.5 - downArrow:GetTall() * 0.5 - SScaleMin(5 / 3), diff, SScaleMin(5 / 3))
downArrow.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
downArrow.DoClick = function()
if tonumber(attributePoint:GetText()) == 0 then
return
end
surface.PlaySound("helix/ui/press.wav")
attributePoint:SetText(tostring(tonumber(attributePoint:GetText()) - 1))
self:AttributesRefresh(attribute, tonumber(attributePoint:GetText()), bSkill)
end
upArrow.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
upArrow.DoClick = function()
if (bSkill and tonumber(attributePoint:GetText()) == 10) or (!bSkill and tonumber(attributePoint:GetText()) == 5) then
return
end
if self:GetPointsLeft(bSkill) <= 0 then
return
end
surface.PlaySound("helix/ui/press.wav")
attributePoint:SetText(tostring(tonumber(attributePoint:GetText()) + 1))
self:AttributesRefresh(attribute, tonumber(attributePoint:GetText()), bSkill)
end
end
-- A function to create the attributes button in the main menu
function PANEL:CreateAttributesButton()
self.attributesButton = self.leftCreation:Add("DButton")
self:CreateMainButton(self.attributesButton, "atrybuty", "attributes")
self.attributesButton.DoClick = function()
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.attributesButton, "attributes", true)
surface.PlaySound(table.Random(self.randomClickSounds))
local textPanel = self.rightCreation:Add("Panel")
textPanel:Dock(TOP)
textPanel:SetTall(SScaleMin(20 / 3))
textPanel:DockMargin(0, SScaleMin(55 / 3), 0, padding)
local panelText = textPanel:Add("DLabel")
panelText:SetText(string.utf8upper("wybór atrybutów"))
panelText:SetFont("MenuFontNoClamp")
panelText:SizeToContents()
panelText:Dock(LEFT)
panelText:SetContentAlignment(4)
if self.faction.noAttributes then
local noAttributes = self.rightCreation:Add("Panel")
noAttributes:Dock(TOP)
noAttributes:DockMargin(0, 0 - SScaleMin(1 / 3), 0, 0)
noAttributes:SetTall(SScaleMin(140 / 3))
noAttributes.Paint = function(_, 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
local noAttributesAvailable = noAttributes:Add("DLabel")
noAttributesAvailable:Dock(FILL)
noAttributesAvailable:SetFont("MenuFontNoClamp")
noAttributesAvailable:SetText("Wybór atrybutów nie jest dostępny dla tej frakcji")
noAttributesAvailable:SetContentAlignment(5)
else
self.attributesRemaining = textPanel:Add("DLabel")
self.attributesRemaining:SetFont("TitlesFontNoClamp")
self.attributesRemaining:DockMargin(0, 0, 0, SScaleMin(3 / 3))
self.attributesRemaining:Dock(RIGHT)
self.attributesRemaining:SetContentAlignment(6)
self.attributesRemaining:SetText(self:GetPointsLeft()..string.utf8upper(" pozostałych punktów"))
self.attributesRemaining:SizeToContents()
self:CreateAttribute("willardnetworks/mainmenu/charcreation/strength.png", 45, 61, "siła", "Znaczne wzmocnienie broni \nNiewielkie wzmocnienie prędkości ruchu i wytwarzania", "strength")
self:CreateAttribute("willardnetworks/mainmenu/charcreation/perception.png", 45, 30, "percepcja", "Znaczne wzmocnienie gotowania \nNiewielkie wzmocnienie przemytu i broni", "perception")
self:CreateAttribute("willardnetworks/mainmenu/charcreation/agility.png", 38, 47, "zręczność", "Znaczne wzmocnienie przemytu i prędkości ruchu \nNiewielkie wzmocnienie medycyny", "agility")
self:CreateAttribute("willardnetworks/mainmenu/charcreation/intelligence.png", 48, 29, "inteligencja", "Znaczne wzmocnienie medycyny i wytwarzania \nNiewielkie wzmocnienie gotowania", "intelligence")
self:CreateRightMenuYellowTextPanel("Atrybuty są permametne, mogą być tylko wzmocnione za pomocą przedmiotów", 5)
end
self:CreateFinishPanel(self.faceButton, self.skillsButton)
end
end
-- A function to create the attributes button in the main menu
function PANEL:CreateSkillsButton()
self.skillsButton = self.leftCreation:Add("DButton")
self:CreateMainButton(self.skillsButton, "umiejętności", "skills")
self.skillsButton.DoClick = function()
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.skillsButton, "skills", true)
surface.PlaySound(table.Random(self.randomClickSounds))
local textPanel = self.rightCreation:Add("Panel")
textPanel:Dock(TOP)
textPanel:SetTall(SScaleMin(20 / 3))
textPanel:DockMargin(0, SScaleMin(55 / 3), 0, padding)
local panelText = textPanel:Add("DLabel")
panelText:SetText(string.utf8upper("wybór umiejętności"))
panelText:SetFont("MenuFontNoClamp")
panelText:SizeToContents()
panelText:Dock(LEFT)
panelText:SetContentAlignment(4)
self.attributesRemaining = textPanel:Add("DLabel")
self.attributesRemaining:SetFont("TitlesFontNoClamp")
self.attributesRemaining:DockMargin(0, 0, 0, SScaleMin(3 / 3))
self.attributesRemaining:Dock(RIGHT)
self.attributesRemaining:SetContentAlignment(6)
self.attributesRemaining:SetText(self:GetPointsLeft(true)..string.utf8upper(" pozostałych punktów"))
self.attributesRemaining:SizeToContents()
local attributes = ix.special.list or {}
for skillID, skillInfo in pairs(ix.skill.list) do
if (skillInfo.uniqueID == "vort" and self.faction.name != "Vortigaunt") or skillInfo.uniqueID == "bartering" then
continue
end
local skillAttributes = {}
-- Find the attributes that boost the skill
for _, v in pairs(attributes) do
if v.skills then
if v.skills[skillInfo.uniqueID] then
skillAttributes[v.skills[skillInfo.uniqueID]] = v
end
end
end
self:CreateAttribute(skillInfo.icon, 60, 60, skillInfo.name, skillInfo.description, skillID, true, skillAttributes[1], skillAttributes[2])
end
self:CreateRightMenuYellowTextPanel("Maksymalny poziom umiejętności wynosi 50", 5)
self:CreateFinishPanel(self.attributesButton, self.backgroundButton)
end
end
-- A function to create a title label at the top of the left side menu
function PANEL:CreateCreationTitle(text, topMargin, bottomMargin)
local leftCreationTitle = self.leftCreation:Add("DLabel")
leftCreationTitle:SetFont("CharCreationBoldTitleNoClamp")
leftCreationTitle:SetText(string.utf8upper(text))
leftCreationTitle:SizeToContents()
leftCreationTitle:DockMargin(0, topMargin, 0, bottomMargin)
leftCreationTitle:Dock(TOP)
end
-- A helper function to create the title labels at top of the left side menu
function PANEL:CreateCreationTitles()
self:CreateCreationTitle("nowa", 0, 0)
self:CreateCreationTitle("postać", SScaleMin((0 - 5) / 3), padding)
end
-- A function to create a button in the left menu
function PANEL:CreateMainButton(parent, text, img)
parent:SetText(string.utf8upper(text))
parent:SetFont("WNMenuFontNoClamp")
parent:SetContentAlignment(4)
parent:SetTextInset(SScaleMin(35 / 3), 0)
parent:SetTextColor(Color(200, 200, 200, 255))
parent:Dock(TOP)
parent:SetSize(self.leftCreation:GetWide(), SScaleMin(36 / 3))
parent:DockMargin(0, 0, 0, padding)
if img != nil then
parent.name = img
else
parent.name = text
end
parent.OnCursorEntered = function()
surface.PlaySound("willardnetworks/charactercreation/hover.wav")
end
parent.Paint = function(this, w, h)
if img != nil then
self:DrawButtonUnselected(img, this, w, h, true)
else
self:DrawButtonUnselected(text, this, w, h, true)
end
end
table.insert(self.mainButtonList, parent)
end
-- A function to draw the character model left of the creation
function PANEL:CreateCharacterModel()
self.characterModelList = self.panelCreation:Add("Panel")
self.characterModelList:SetSize(SScaleMin(400 / 3), ScrH())
self.characterModelList:Center()
self.characterModel = self.characterModelList:Add("ixModelPanel")
self.characterModel:Dock(FILL)
self.characterModel:SetModel("models/willardnetworks/citizens/female_01.mdl")
self.characterModel:SetFOV(26)
self.characterModel.PaintModel = self.characterModel.Paint
self.originPos = self.characterModel:GetCamPos()
self.originLookAt = self.characterModel:GetLookAt()
end
-- A function to create a panel for text in the right side panel
function PANEL:CreateRightMenuTextPanel(text, topMargin)
local textPanel = self.rightCreation:Add("Panel")
textPanel:Dock(TOP)
textPanel:SetTall(margin)
textPanel:DockMargin(0, SScaleMin(topMargin / 3), 0, padding)
local panelText = textPanel:Add("DLabel")
panelText:SetText(string.utf8upper(text))
panelText:SetFont("MenuFontNoClamp")
panelText:SizeToContents()
panelText:Dock(LEFT)
panelText:SetContentAlignment(4)
return panelText
end
-- A function to create a text entry in the right side panel
function PANEL:CreateRightMenuTextEntry(parent, text, height, boolMultiline, maxChars, name)
parent:Dock(TOP)
parent:SetTall(SScaleMin(height / 3))
parent:DockMargin(0, 0, 0, padding)
parent:SetMultiline( boolMultiline )
parent:SetVerticalScrollbarEnabled( boolMultiline )
parent:SetEnterAllowed( boolMultiline )
parent:SetTextColor(Color(200, 200, 200, 255))
parent:SetCursorColor(Color(200, 200, 200, 255))
parent:SetFont("MenuFontNoClamp")
parent:SetPlaceholderText(text or "")
parent:SetPlaceholderColor( Color(200, 200, 200, 255) )
if name == "name" then
parent:SetText(self.payload.name or "")
elseif name == "desc" then
parent:SetText(self.payload.description or "")
end
parent.Paint = function(this, 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)
if ( this.GetPlaceholderText and this.GetPlaceholderColor and this:GetPlaceholderText() and this:GetPlaceholderText():Trim() != "" and this:GetPlaceholderColor() and ( !this:GetText() or this:GetText() == "" ) ) then
local oldText = this:GetText()
local str = this:GetPlaceholderText()
if ( str:StartWith( "#" ) ) then str = str:utf8sub( 2 ) end
str = language.GetPhrase( str )
this:SetText( str )
this:DrawTextEntryText( this:GetPlaceholderColor(), this:GetHighlightColor(), this:GetCursorColor() )
this:SetText( oldText )
return
end
this:DrawTextEntryText( this:GetTextColor(), this:GetHighlightColor(), this:GetCursorColor() )
end
parent.MaxChars = maxChars
parent.OnTextChanged = function(parentSelf)
if name == "name" then
self.payload:Set("name", parentSelf:GetValue())
end
if name == "desc" then
self.payload:Set("description", parentSelf:GetValue())
end
self:CheckIfFinished()
end
end
-- A function to create a gender button inside a right side panel
function PANEL:CreateGenderButton(parent, icon, w, h, rightMargin, gender)
parent:SetSize( SScaleMin(w / 3), SScaleMin(h / 3) )
parent:SetImage( icon )
parent:Dock(RIGHT)
parent:DockMargin(0, 0, SScaleMin(rightMargin / 3), 0)
parent:SetColor(Color(150, 150, 150, 255))
if self.payload.gender != "male" and self.payload.gender != "female" then
self.payload:Set("gender", "female")
end
if gender == "male" and self.payload.gender == "male" then
parent:SetColor(Color(255, 204, 0, 255))
end
if gender == "female" and self.payload.gender == "female" then
parent:SetColor(Color(255, 204, 0, 255))
end
parent.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
parent.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
parent:SetColor(Color(255, 204, 0, 255))
if gender == "female" then
if self.genderButtonMale then
self.genderButtonMale:SetColor(Color(150, 150, 150, 255))
end
self.payload:Set("gender", "female")
self.payload:Set("model", 1)
else
if self.genderButtonFemale then
self.genderButtonFemale:SetColor(Color(150, 150, 150, 255))
end
self.payload:Set("gender", "male")
self.payload:Set("model", 1)
end
self:ResetModelCam()
local eyeColorTable = self:GetActiveSkinEyeColorTable()
self.characterModel.Entity:SetSkin(eyeColorTable[1] or 0)
self.payload.data["skin"] = eyeColorTable[1]
self.payload.data["groups"] = {}
self.payload.data["glasses"] = false
self.payload.data["canread"] = true
self.payload:Set("hair", {hair = 0, color = self.payload.hair.color})
self.payload.data.groups[self.beardBodygroups] = 0
self.payload.data.groups[self.hairBodygroups] = 0
self:CheckIfFinished()
end
end
-- A function to create a custom DComboBox
function PANEL:CreateSelectionMenu(translate, parent, width, text, selections)
local faction = ix.faction.indices[self.payload.faction]
parent:Dock(LEFT)
parent:SetWide(SScaleMin(width / 3))
if (self.payload.data[text] != nil and self.payload.data[text] != "") then
if (string.utf8len(self.payload.data[text]) > 7) and faction.name != "Vortigaunt" then
parent:SetText(string.utf8sub(self.payload.data[text], 1, 7).."..")
elseif faction.name == "Vortigaunt" and string.utf8len(self.payload.data[text]) > 20 then
parent:SetText(string.utf8sub(self.payload.data[text], 1, 20).."..")
else
parent:SetText(self.payload.data[text])
end
else
parent:SetText(string.utf8upper(translate))
end
parent:DockMargin(0, 0, SScaleMin(13 / 3), 0)
parent:SetFont("MenuFontNoClamp")
parent:SetTextColor(Color(200, 200, 200, 255))
parent:SetContentAlignment(4)
parent:SetTextInset(padding, 0)
parent.Paint = function(this, 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)
local alpha = (this:IsHovered()) and 255 or 100
surface.SetDrawColor(ColorAlpha(color_white, alpha))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/combodownarrow.png"))
surface.DrawTexturedRect(w - SScaleMin(9 / 3) - padding, h * 0.5 - SScaleMin(5 / 3) * 0.5, SScaleMin(9 / 3), SScaleMin(5 / 3))
end
local savedText = parent:GetText()
parent.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
savedText = parent:GetText()
parent:SetText(string.utf8upper(translate))
end
parent.OnCursorExited = function()
parent:SetText(string.utf8upper(savedText))
end
parent.DoClick = function()
if text == "eye color" and (self.payload.faction == FACTION_CITIZEN or self.payload.faction == FACTION_ADMIN or self.payload.faction == FACTION_WORKERS or self.payload.faction == FACTION_MEDICAL) then
if self.characterModel.Entity:LookupBone("ValveBiped.Bip01_Head1") then
local eyepos = self.characterModel.Entity:GetBonePosition( self.characterModel.Entity:LookupBone("ValveBiped.Bip01_Head1") )
if eyepos then
self.characterModel:SetLookAt(eyepos)
self.characterModel:SetCamPos(eyepos-Vector(-12, -12, 0)) -- Move cam in front of eyes
self.characterModel:SetFOV(34)
end
end
else
self:ResetModelCam()
end
surface.PlaySound("helix/ui/press.wav")
if IsValid(self.dropdownMenu) then
self.dropdownMenu:Remove()
return
end
self.dropdownMenu = self.panelCreation:Add("DScrollPanel")
if #selections < 8 then
self.dropdownMenu:SetSize( SScaleMin(width / 3), #selections * (SScaleMin(36 / 3) / 2) - (#selections * 1) )
else
self.dropdownMenu:SetSize( SScaleMin(width / 3), (SScaleMin(36 / 3) / 2 ) * 8 - (#selections * 1) )
end
self.dropdownMenu:SetPos(self.panelCreation:ScreenToLocal( parent:LocalToScreen( 0, SScaleMin(36 / 3) ) ))
self.dropdownMenu.Paint = function(_, 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
for _, v in pairs(selections) do
local selectionButton = self.dropdownMenu:Add("DButton")
selectionButton:Dock(TOP)
selectionButton:SetTall( SScaleMin(36 / 3) / 2 )
selectionButton:SetText(string.utf8upper(v))
selectionButton:DockMargin(0, 0 - SScaleMin(1 / 3), 0, 0)
selectionButton:SetContentAlignment(4)
selectionButton:SetTextInset(padding, 0)
selectionButton:SetFont("WNBackFontNoClamp")
if text == "language" then
local languageText = v != "brak" and ix.languages:FindByID(v).name or v
selectionButton:SetText(string.utf8upper(languageText))
end
selectionButton.Paint = function(_, 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.DrawRect(0, 0, w, h)
end
selectionButton.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
self.payload.data[text] = selectionButton:GetText() or ""
if text == "eye color" then
local eyeColorTable = self:GetActiveSkinEyeColorTable()
self.characterModel.Entity:SetSkin(eyeColorTable[1] or 0)
self.payload.data["skin"] = eyeColorTable[1]
end
if text == "language" and v != "brak" then
self.payload.data["languages"] = {v}
end
if string.utf8len(selectionButton:GetText()) > 7 and faction.name != "Vortigaunt" then
parent:SetText(string.utf8sub(selectionButton:GetText(), 1, 7).."..")
elseif faction.name == "Vortigaunt" and string.utf8len(selectionButton:GetText()) > 20 then
parent:SetText(string.utf8sub(selectionButton:GetText(), 1, 20).."..")
else
parent:SetText(selectionButton:GetText())
end
if IsValid(self.dropdownMenu) then
self.dropdownMenu:Remove()
end
self:CheckIfFinished()
end
end
self:CheckIfFinished()
end
end
-- A function to create a important text panel in the right side menu
function PANEL:CreateRightMenuYellowTextPanel(text, topMargin)
local textPanel = self.rightCreation:Add("Panel")
textPanel:Dock(TOP)
textPanel:SetTall(margin)
textPanel:DockMargin(0, SScaleMin(topMargin / 3), 0, padding)
local warningIcon = textPanel:Add("DImage")
warningIcon:SetSize(SScaleMin(12 / 3), margin)
warningIcon:Dock(LEFT)
warningIcon:DockMargin(0, 0, SScaleMin(8 / 3), 0)
warningIcon:SetImage("willardnetworks/mainmenu/charcreation/warning.png")
local panelText = textPanel:Add("DLabel")
panelText:SetText(text)
panelText:SetFont("WNBackFontNoClamp")
panelText:SizeToContents()
panelText:SetTextColor(Color(255, 204, 0, 255))
panelText:Dock(LEFT)
panelText:SetContentAlignment(4)
return panelText
end
-- A function to create the text next/back/finish buttons at the bottom of the right side menu
function PANEL:CreateNextBackFinishButtons(parentBack, parentNext, parentFinish, boolNext)
local function Paint(_, 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
parentBack:Dock(LEFT)
parentBack:SetWide(SScaleMin(100 / 3))
parentBack:SetText(string.utf8upper("wstecz"))
parentBack:SetContentAlignment(6)
parentBack:SetTextInset(padding, 0)
parentBack:SetFont("MenuFontNoClamp")
parentBack.Paint = function(this, w, h)
Paint(this, w, h)
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/leftarrow.png"))
surface.DrawTexturedRect(padding, h * 0.5 - SScaleMin(36 / 3) * 0.5, SScaleMin(7 / 3), SScaleMin(36 / 3))
end
parentBack.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
parentBack.DoClick = function()
self.progress:DecrementProgress()
ix.panelCreationActive = false
ix.gui.mapsceneActive = nil
ix.gui.blackBarBottom:ColorTo( Color(0, 0, 0, 0), 0, 0 )
ix.gui.blackBarTop:ColorTo( Color(0, 0, 0, 0), 0, 0 )
ix.gui.blackBarTop:SetVisible(false)
ix.gui.blackBarBottom:SetVisible(false)
if (self.WhitelistCount == 1) then
self.factionBack:DoClick()
else
self:SetActiveSubpanel("faction")
end
self:ResetModelCam()
end
parentNext:Dock(LEFT)
parentNext:DockMargin(padding, 0, 0, 0)
parentNext:SetWide(SScaleMin(100 / 3))
parentNext:SetText(string.utf8upper("dalej"))
parentNext:SetContentAlignment(4)
parentNext:SetTextInset(padding, 0)
parentNext:SetFont("MenuFontNoClamp")
parentNext.Paint = function(this, w, h)
if isbool(boolNext) and boolNext == false then
parentNext:SetTextColor(Color(255, 255, 255, 30))
surface.SetDrawColor(255, 255, 255, 5)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(255, 255, 255, 30)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/rightarrow.png"))
surface.DrawTexturedRect(w - SScaleMin(7 / 3) - padding, h * 0.5 - SScaleMin(36 / 3) * 0.5, SScaleMin(7 / 3), SScaleMin(36 / 3))
return
else
Paint(this, w, h)
end
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/rightarrow.png"))
surface.DrawTexturedRect(w - SScaleMin(7 / 3) - padding, h * 0.5 - SScaleMin(36 / 3) * 0.5, SScaleMin(7 / 3), SScaleMin(36 / 3))
end
parentNext.OnCursorEntered = function()
if boolNext then
return
end
surface.PlaySound("helix/ui/rollover.wav")
end
parentFinish:Dock(LEFT)
parentFinish:DockMargin(padding, 0, 0, 0)
parentFinish:SetWide(SScaleMin(100 / 3))
parentFinish:SetTextColor(Color(255, 255, 255, 30))
parentFinish:SetText(string.utf8upper("ukończ"))
parentFinish:SetContentAlignment(4)
parentFinish:SetTextInset(padding, 0)
parentFinish:SetFont("MenuFontNoClamp")
parentFinish.Paint = function(_, w, h)
self:DrawFinishButtonNonAvailable(w, h)
end
end
-- A function to create a the character button in the left side menu
function PANEL:CreateCharacterButton()
self.characterButton = self.leftCreation:Add("DButton")
self:CreateMainButton(self.characterButton, "postać", "character")
self.characterButton.DoClick = function()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.characterButton, "character", true)
if ix.panelCreationActive == true then
surface.PlaySound(table.Random(self.randomClickSounds))
end
self:CreateRightMenuTextPanel(self.faction:GetNoGender(LocalPlayer()) != true and "imię i nazwisko/płeć" or "imię i nazwisko", 60)
-- Name
local nameGenderPanel = self.rightCreation:Add("DTextEntry")
self:CreateRightMenuTextEntry(nameGenderPanel, "Wprowadź tutaj imię i nazwisko postaci...", 36, false, 35, "name")
if self.faction:GetNoGender(LocalPlayer()) != true then
-- Gender
self.genderButtonFemale = nameGenderPanel:Add("DImageButton")
self:CreateGenderButton(self.genderButtonFemale, "willardnetworks/mainmenu/charcreation/female.png", 13, 36, 10, "female")
self.genderButtonMale = nameGenderPanel:Add("DImageButton")
self:CreateGenderButton(self.genderButtonMale, "willardnetworks/mainmenu/charcreation/male.png", 16, 36, 5, "male")
end
local minLength = ix.config.Get("minNameLength", 4)
local maxLength = ix.config.Get("maxNameLength", 32)
local namewarning = self:CreateRightMenuYellowTextPanel("Imię i nazwisko postaci musi składać się z co najmniej "..minLength.." znaków ("..string.len(self.payload.name or "").." / "..maxLength..")", -1)
nameGenderPanel.OnTextChanged = function(this)
self.payload:Set("name", this:GetValue())
self:CheckIfFinished()
namewarning:SetText("Imię i nazwisko postaci muszą składać się z co najmniej "..minLength.." znaków ("..string.len(this:GetValue() or "").." / "..maxLength..")")
namewarning:SizeToContents()
end
if self.faction:GetNoGenetics(LocalPlayer()) != true then
-- Genetics
self:CreateRightMenuTextPanel("opis cech genetycznych", 10)
local comboBoxPanel = self.rightCreation:Add("Panel")
comboBoxPanel:Dock(TOP)
comboBoxPanel:SetTall(SScaleMin(36 / 3))
local ageComboBox = comboBoxPanel:Add("DButton")
if self.faction.name == "Vortigaunt" then
self:CreateSelectionMenu("wiek", ageComboBox, 148, "age", {"młodzik (0 - 100)", "młodzian (100 - 500)", "dorosły (500 - 1000)", "mędrzec (1000 - 1500)", "starszy (1500 - 2000)"})
else
self:CreateSelectionMenu("wiek", ageComboBox, 100, "age", {"młody dorosły", "dorosły", "w średnim wieku", "starszy"})
end
local heightComboBox = comboBoxPanel:Add("DButton")
if self.faction.name == "Civil Protection" then
self:CreateSelectionMenu("wzrost", heightComboBox, 90, "height", {"5'5\"", "5'6\"", "5'8\"", "5'10\"", "6'0\"", "6'2\""})
elseif self.faction.name == "Vortigaunt" then
self:CreateSelectionMenu("wzrost", heightComboBox, 148, "height", {"6'4\"", "6'5\"", "6'6\"", "6'7\"", "6'8\"", "6'9\"", "6'10\"", "6'11\""})
else
self:CreateSelectionMenu("wzrost", heightComboBox, 90, "height", {"5'2\"", "5'4\"", "5'6\"", "5'8\"", "5'10\"", "6'0\"", "6'2\""})
end
local eyeColorBox = comboBoxPanel:Add("DButton")
if self.faction.name == "Vortigaunt" then
self:CreateSelectionMenu("kolor oczu", eyeColorBox, 146, "eye color", {"czerwone", "żółte", "pomarańczowe"})
else
self:CreateSelectionMenu("kolor oczu", eyeColorBox, 110, "eye color", {"niebieskie", "zielone", "brązowe", "piwne", "bursztynowe", "szare"})
end
self:CreateRightMenuYellowTextPanel("Wartości opisu cech genetycznych są permanentne.", 10)
end
if self.faction.name != "Overwatch AI" then
local languages = {}
if (ix.languages) then
for _, v in pairs(ix.languages.stored) do
if (!v.notSelectable) then
table.insert(languages, v.uniqueID)
end
end
end
table.insert(languages, "brak")
self:CreateRightMenuTextPanel("drugi język", 10)
local languageBoxPanel = self.rightCreation:Add("Panel")
languageBoxPanel:Dock(TOP)
languageBoxPanel:SetTall(SScaleMin(36 / 3))
local languageComboBox = languageBoxPanel:Add("DButton")
self:CreateSelectionMenu("język", languageComboBox, 110, "language", languages)
end
-- Description
self:CreateRightMenuTextPanel("opis fizyczny postaci", 20)
local charDescPanel = self.rightCreation:Add("DTextEntry")
self:CreateRightMenuTextEntry(charDescPanel, "Wprowadź tutaj opis fizyczny swojej postaci...", 130, true, 1000, "desc")
local minDescLength = ix.config.Get("minDescriptionLength", 16)
local maxDescLength = ix.config.Get("maxDescriptionLength", 512)
local descLength = self:CreateRightMenuYellowTextPanel("Opis musi składać się z co najmniej "..minDescLength.." znaków ("..string.len(self.payload.description or "").." / "..maxDescLength..")", -1)
charDescPanel.OnTextChanged = function(this)
self.payload:Set("description", this:GetValue())
self:CheckIfFinished()
descLength:SetText("Opis musi składać się z co najmniej "..minDescLength.." znaków ("..string.len(this:GetValue()).." / "..maxDescLength..")")
descLength:SizeToContents()
end
self:CreateFinishPanel(false, self.appearancesButton)
end
end
-- A function to refresh what skins a model has depending on gender etc.
function PANEL:RefreshSkins()
if !table.IsEmpty(self.skinButtonList) then
table.Empty(self.skinButtonList)
end
if !table.IsEmpty(self.glassesButtonList) then
table.Empty(self.glassesButtonList)
end
for _, v in pairs(self.skinButtonPanel:GetChildren()) do
v:Remove()
end
if self.glassesButtonPanel and IsValid(self.glassesButtonPanel) then
for _, v in pairs(self.glassesButtonPanel:GetChildren()) do
v:Remove()
end
end
local eyeColorTable = self:GetActiveSkinEyeColorTable()
for k, v in pairs(eyeColorTable) do
local skinButton = self.skinButtonPanel:Add("DButton")
skinButton:Dock(LEFT)
skinButton:SetWide(math.Round(self.rightCreation:GetWide() / (#eyeColorTable)) - padding)
skinButton:DockMargin(0, 0, padding, 0)
skinButton:SetText(k)
skinButton:SetFont("MenuFontNoClamp")
skinButton.name = k
table.insert(self.skinButtonList, skinButton)
if self.payload.data["skin"] == v then
self:SetButtonSelected(skinButton, k, false)
else
skinButton.Paint = function(selfSkin, 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
end
skinButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
skinButton.DoClick = function()
self:ClearSelectedSkins(self.skinButtonList)
self:SetButtonSelected(skinButton, k, false)
surface.PlaySound("helix/ui/press.wav")
self.payload.data["skin"] = v
self.characterModel.Entity:SetSkin(v)
if (self.payload.faction == FACTION_CITIZEN or self.payload.faction == FACTION_ADMIN or self.payload.faction == FACTION_WORKERS or self.payload.faction == FACTION_MEDICAL) then
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(34)
end
end
end
end
if self.glassesButtonPanel and IsValid(self.glassesButtonPanel) then
for i = 1, 2 do
local glassesButton = self.glassesButtonPanel:Add("DButton")
glassesButton:Dock(LEFT)
if i == 1 then
glassesButton:SetText("NIE")
else
glassesButton:SetText("TAK")
end
glassesButton:SetWide((math.Round(self.rightCreation:GetWide() / 2) - padding))
glassesButton:DockMargin(0, 0, padding, 0)
glassesButton:SetFont("MenuFontNoClamp")
glassesButton.name = glassesButton:GetText()
table.insert(self.glassesButtonList, glassesButton)
if self.payload.data.glasses == true and i == 2 then
self:SetButtonSelected(glassesButton, "YES", false)
elseif self.payload.data.glasses == false and i == 1 then
self:SetButtonSelected(glassesButton, "NO", false)
else
glassesButton.Paint = function(selfSkin, 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
end
glassesButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
glassesButton.DoClick = function()
for _, v in pairs(self.glassesButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
self:SetButtonSelected(glassesButton, glassesButton.name, false)
surface.PlaySound("helix/ui/press.wav")
if i == 2 then
self.payload.data["glasses"] = true
self.characterModel.Entity:SetBodygroup(8, 1)
self.payload.data.chosenClothes["8"] = 1
else
self.payload.data["glasses"] = false
self.characterModel.Entity:SetBodygroup(8, 0)
self.payload.data.chosenClothes["8"] = 0
end
self:ResetModelCam()
end
end
end
end
function PANEL:RefreshBeards()
if !table.IsEmpty(self.beardButtonList) then
table.Empty(self.beardButtonList)
end
if self.payload.gender == "male" then
for _, v in pairs(self.beardButtonPanel:GetChildren()) do
v:Remove()
end
end
if self.payload.gender == "male" then
for i = 0, 8 do
local beardButton = self.beardButtonPanel:Add("DButton")
beardButton:Dock(LEFT)
if i == 0 then
beardButton:SetText("BEZ BRODY")
beardButton:SetWide((math.Round(self.rightCreation:GetWide() / 9) * 2) - padding)
else
beardButton:SetText(i + 1)
beardButton:SetWide(math.Round(self.rightCreation:GetWide() / 10) - padding)
end
beardButton:DockMargin(0, 0, padding, 0)
beardButton:SetFont("MenuFontNoClamp")
beardButton.name = i
table.insert(self.beardButtonList, beardButton)
if self.payload.data.groups[self.beardBodygroups] == i then
self:SetButtonSelected(beardButton, i, false)
else
beardButton.Paint = function(selfSkin, 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
end
beardButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
beardButton.DoClick = function()
for _, v in pairs(self.beardButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
self:SetButtonSelected(beardButton, i, false)
surface.PlaySound("helix/ui/press.wav")
self.payload.data.groups[self.beardBodygroups] = i
self.characterModel.Entity:SetBodygroup(11, i)
if (self.payload.faction == FACTION_CITIZEN or self.payload.faction == FACTION_ADMIN or self.payload.faction == FACTION_WORKERS or self.payload.faction == FACTION_MEDICAL) then
if self.characterModel.Entity:LookupBone("ValveBiped.Bip01_Head1") then
local eyepos = self.characterModel.Entity:GetBonePosition( self.characterModel.Entity:LookupBone("ValveBiped.Bip01_Head1") )
if eyepos then
self.characterModel:SetLookAt(eyepos)
self.characterModel:SetCamPos(eyepos-Vector(-12, -12, 0)) -- Move cam in front of eyes
self.characterModel:SetFOV(34)
end
end
end
end
end
end
end
-- A function to create a button panel
function PANEL:CreateButtonPanel(parent)
parent:Dock(TOP)
parent:DockMargin(0, 0, 0, 0)
parent:SetSize(self.rightCreation:GetWide(), SScaleMin(36 / 3))
end
-- A function to create the appearances button in the left side menu
function PANEL:CreateAppearancesButton()
self.appearancesButton = self.leftCreation:Add("DButton")
self:CreateMainButton(self.appearancesButton, "wygląd", "appearances")
self.appearancesButton.DoClick = function()
local faction = ix.faction.indices[self.payload.faction]
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.appearancesButton, "appearances", true)
surface.PlaySound(table.Random(self.randomClickSounds))
self:CreateRightMenuTextPanel("wybór modelu", 60)
local modelSelectionPanel = self.rightCreation:Add("DScrollPanel")
modelSelectionPanel:Dock(TOP)
local modelSelectionGrid = modelSelectionPanel:Add( "DGrid" )
local iconSize = SScaleMin(94 / 3)
if (self.rightCreation:GetWide() - (SScaleMin(94 / 3) * 6)) >= SScaleMin(94 / 3) then
modelSelectionGrid:SetCols( 6 )
elseif (self.rightCreation:GetWide() - (SScaleMin(94 / 3) * 7)) >= SScaleMin(94 / 3) then
modelSelectionGrid:SetCols( 7 )
elseif (self.rightCreation:GetWide() - (SScaleMin(94 / 3) * 8)) >= SScaleMin(94 / 3) then
modelSelectionGrid:SetCols( 8 )
else
modelSelectionGrid:SetCols( 5 )
end
local rowCount = math.ceil(#self:GetFactionModelsGender(faction) / modelSelectionGrid:GetCols())
modelSelectionGrid:SetColWide( rowCount > 2 and iconSize - 5 or iconSize )
modelSelectionGrid:SetRowHeight( iconSize )
modelSelectionPanel:SetTall(math.Clamp(rowCount, 0, 2) * iconSize)
self.skinButtonList = {}
self.glassesButtonList = {}
self.canreadButtonList = {}
for k, v in pairs(self:GetFactionModelsGender(faction)) do
local iconbg = vgui.Create("Panel")
iconbg:SetSize(SScaleMin(84 / 3), SScaleMin(84 / 3))
iconbg.Paint = function(_, 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
local icon = iconbg:Add("SpawnIcon")
icon:SetSize(SScaleMin(82 / 3), SScaleMin(82 / 3))
icon:Center()
icon:InvalidateLayout(true)
icon.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
icon.DoClick = function(this)
self:CheckForSkinCount(k)
self.payload:Set("model", k)
if self.payload.data.chosenClothes[self.torsoBodygroups] then
self.characterModel.Entity:SetBodygroup(tonumber(self.torsoBodygroups), tonumber(self.payload.data.chosenClothes[self.torsoBodygroups]))
end
if self.payload.data.chosenClothes[self.legsBodygroups] then
self.characterModel.Entity:SetBodygroup(tonumber(self.legsBodygroups), tonumber(self.payload.data.chosenClothes[self.legsBodygroups]))
end
if self.payload.data.chosenClothes[self.shoesBodygroups] then
self.characterModel.Entity:SetBodygroup(tonumber(self.shoesBodygroups), tonumber(self.payload.data.chosenClothes[self.shoesBodygroups]))
end
if self.payload.data["glasses"] == true then
self.characterModel.Entity:SetBodygroup(8, 1)
end
self.payload:Set("hair", {hair = 0, color = Color(244,233,230)})
local eyeColorTable = self:GetActiveSkinEyeColorTable()
self.characterModel.Entity:SetSkin(eyeColorTable[1] or 0)
self.payload.data["skin"] = eyeColorTable[1]
self.payload.data.groups[self.beardBodygroups] = 0
self.payload.data.groups[self.hairBodygroups] = 0
if faction:GetNoAppearances(LocalPlayer()) != true then
self:RefreshSkins()
end
self:ResetModelCam()
surface.PlaySound("helix/ui/press.wav")
end
icon.PaintOver = function(this, w, h)
if (self.payload.model == k) then
surface.SetDrawColor(255, 78, 69, 100)
for _ = 1, 3 do
surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
end
end
end
if (isstring(v)) then
icon:SetModel(v)
else
icon:SetModel(v[1], v[2] or 0, v[3])
end
modelSelectionGrid:AddItem( iconbg )
end
self:CreateRightMenuYellowTextPanel("Wybrany model postaci jest permanentny.", 10)
if faction:GetNoAppearances(LocalPlayer()) != true then
self:CreateRightMenuTextPanel((faction.index == FACTION_VORT and "kolor skóry/zmarszczki" or "rysy twarzy"), 10)
self.skinButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(self.skinButtonPanel)
if faction.index != FACTION_VORT then
self:CreateRightMenuTextPanel("Czy postać potrzebuje okularów?", 20)
self.glassesButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(self.glassesButtonPanel)
self:CreateRightMenuYellowTextPanel("Opcja 'TAK' oznacza, że obraz bez okularów będzie rozmazany.", 10)
end
self:RefreshSkins()
end
if !faction.ReadOptionDisabled then
self:CreateRightMenuTextPanel("Czy postać umie czytać?", 5)
local canreadButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(canreadButtonPanel)
-- Can read
if !table.IsEmpty(self.canreadButtonList) then
table.Empty(self.canreadButtonList)
end
if self.payload.data.canread == nil then
self.payload.data["canread"] = true
end
for i = 1, 2 do
local canreadButton = canreadButtonPanel:Add("DButton")
canreadButton:Dock(LEFT)
if i == 1 then
canreadButton:SetText("NIE")
else
canreadButton:SetText("TAK")
end
canreadButton:SetWide((math.Round(self.rightCreation:GetWide() / 2) - padding))
canreadButton:DockMargin(0, 0, padding, 0)
canreadButton:SetFont("MenuFontNoClamp")
canreadButton.name = canreadButton:GetText()
table.insert(self.canreadButtonList, canreadButton)
if self.payload.data.canread == true and i == 2 then
self:SetButtonSelected(canreadButton, "YES", false)
elseif self.payload.data.canread == false and i == 1 then
self:SetButtonSelected(canreadButton, "NO", false)
else
canreadButton.Paint = function(selfSkin, 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
end
canreadButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
canreadButton.DoClick = function()
for _, v in pairs(self.canreadButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
self:SetButtonSelected(canreadButton, canreadButton.name, false)
surface.PlaySound("helix/ui/press.wav")
if i == 2 then
self.payload.data["canread"] = true
else
self.payload.data["canread"] = false
end
end
end
self:CreateRightMenuYellowTextPanel("Opcja 'NIE' oznacza, że litery m.in. w książkach będą w zmienionej kolejności.", 10)
end
self:CreateFinishPanel(self.characterButton, self.hairButton)
end
end
-- A helper function to create the finish panel at the bottom of the right side menu
function PANEL:CreateFinishPanel(back, next)
local buttonPanel = self.rightCreation:Add("Panel")
buttonPanel:Dock(TOP)
buttonPanel:DockMargin(SScaleMin(140 / 3), margin, 0, 0)
buttonPanel:SetTall(SScaleMin(36 / 3))
local backButton = buttonPanel:Add("DButton")
local nextButton = buttonPanel:Add("DButton")
self.finishButton = buttonPanel:Add("DButton")
self:CreateNextBackFinishButtons(backButton, nextButton, self.finishButton, next)
if back then
backButton.DoClick = function()
back.DoClick()
end
end
if next then
nextButton.DoClick = function()
next.DoClick()
end
end
self:CheckIfFinished()
end
-- A function to create the buttons for the bodygroups
function PANEL:CreateBodyGroupButtons(parent, bodygroup, min, max)
local torsoButtonList = {}
local shoesButtonList = {}
local trouserButtonList = {}
self.hairButtonList = self.hairButtonList or {}
local function ClearSelectedBodygroups(bodygroup2)
if bodygroup2 == "torso" then
for _, v in pairs(torsoButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
elseif bodygroup2 == "shoes" then
for _, v in pairs(shoesButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
elseif bodygroup2 == "legs" then
for _, v in pairs(trouserButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
else
for _, v in pairs(self.hairButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
end
end
local caTorsos = {}
local caLegs = {}
local caShoes = {}
for name, v in pairs(self.ccaClothingList) do
if v.outfitCategory == "Torso" then
caTorsos[name] = v.bg
end
if v.outfitCategory == "Legs" then
caLegs[name] = v.bg
end
if v.outfitCategory == "Shoes" then
caShoes[name] = v.bg
end
end
local torsos = {}
local legs = {}
local shoes = {}
for name, v in pairs(self.clothingList) do
if v.outfitCategory == "Torso" then
torsos[name] = v.bg
end
if v.outfitCategory == "Legs" then
legs[name] = v.bg
end
if v.outfitCategory == "Shoes" then
shoes[name] = v.bg
end
end
local hairs = {}
local gender = self.payload.gender
for i = 0, gender == "female" and 14 or 12 do hairs[#hairs + 1] = i end
local usedTorsoTable = torsos
local usedLegsTable = legs
local usedShoesTable = shoes
local usedHairsTable = hairs
if self.payload.faction == FACTION_ADMIN then
usedTorsoTable = caTorsos
usedLegsTable = caLegs
usedShoesTable = caShoes
end
local activeTable = usedTorsoTable
if bodygroup == "legs" then
activeTable = usedLegsTable
end
if bodygroup == "shoes" then
activeTable = usedShoesTable
end
if bodygroup == "hair" then
activeTable = usedHairsTable
end
local amount = #activeTable == 0 and #table.GetKeys(activeTable) or #activeTable
local actualAmount = amount
local curAdd = 1
local activeClothingTable = self.payload.faction == FACTION_ADMIN and self.ccaClothingList or self.clothingList
for itemName, bgValue in pairs(activeTable) do
if min or max then
local k = itemName
if k < min or k > max then continue end
end
local bodygroupButton = parent:Add("DButton")
bodygroupButton:Dock(LEFT)
bodygroupButton:SetWide(math.Round(self.rightCreation:GetWide() / (actualAmount - (bodygroup != "hair" and 0 or 7))) - padding)
bodygroupButton:SetText(isstring(itemName) and curAdd or itemName or "")
bodygroupButton:SetFont("MenuFontNoClamp")
bodygroupButton:DockMargin(0, 0, padding, 0)
bodygroupButton.name = bgValue
if activeClothingTable[itemName] and activeClothingTable[itemName].uniqueID then
bodygroupButton.item = activeClothingTable[itemName].uniqueID
end
if activeClothingTable[itemName] then
if activeClothingTable[itemName].color then
bodygroupButton.color = activeClothingTable[itemName].color
end
end
if bodygroup == "torso" then
table.insert(torsoButtonList, bodygroupButton)
elseif bodygroup == "shoes" then
table.insert(shoesButtonList, bodygroupButton)
elseif bodygroup == "legs" then
table.insert(trouserButtonList, bodygroupButton)
else
table.insert(self.hairButtonList, bodygroupButton)
end
bodygroupButton.Paint = function(_, 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
local selectionTable = {"torso", "legs", "shoes", "hair"}
for _, v2 in pairs(selectionTable) do
if v2 != "hair" then
if self.payload.data.chosenClothes then
if self.payload.data.chosenClothes[v2] then
if self.payload.data.chosenClothes[v2] == bodygroupButton.item then
self:SetButtonSelected(bodygroupButton, bgValue, false)
end
end
end
end
if v2 == "hair" and self.payload.hair and self.payload.hair.hair then
if bgValue == self.payload.hair.hair then
self:SetButtonSelected(bodygroupButton, bgValue, false)
end
end
end
bodygroupButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
bodygroupButton.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
ClearSelectedBodygroups(bodygroup)
self:SetButtonSelected(bodygroupButton, bgValue, false)
if bodygroup != "hair" then
self.characterModel.Entity:SetBodygroup(tonumber(self[bodygroup.."Bodygroups"]), bgValue)
self.payload.data.chosenClothes[tonumber(self[bodygroup.."Bodygroups"])] = bgValue
self.payload.data.chosenClothes[bodygroup] = activeClothingTable[itemName].uniqueID
if !self.payload.data.chosenClothes.color then self.payload.data.chosenClothes.color = {} end
table.Merge(self.payload.data.chosenClothes.color, bodygroupButton.color)
for name, color in pairs(self.payload.data.chosenClothes.color) do
self.characterModel.overrideProxyColors[name] = color
end
else
self.payload:Set("hair", {hair = bgValue, color = self.payload.hair.color})
self.payload.data.groups[self.hairBodygroups] = bgValue
self.characterModel.Entity:SetBodygroup(self.characterModel.Entity:FindBodygroupByName("hair"), bgValue)
end
self:ResetModelCam()
if bodygroup == "shoes" then
local footpos = self.characterModel.Entity:GetBonePosition( self.characterModel.Entity:LookupBone("ValveBiped.Bip01_L_Foot") )
if footpos then
if self.payload.gender == "female" then
footpos:Add(Vector(2, 0, 5)) -- Move right slightly
else
footpos:Add(Vector(4, 0, 5)) -- Move right slightly
end
self.characterModel:SetLookAt(footpos)
self.characterModel:SetCamPos(footpos-Vector(-12, -12, 0)) -- Move cam in front of feet
self.characterModel:SetFOV(54)
end
end
end
curAdd = curAdd + 1
end
end
-- A function to create the hair button on the left side menu
function PANEL:CreateHairButton()
self.hairButton = self.leftCreation:Add("DButton")
self:CreateMainButton(self.hairButton, "włosy", "hair")
self.hairButton.DoClick = function()
self.beardButtonList = {}
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.hairButton, "hair", true)
surface.PlaySound(table.Random(self.randomClickSounds))
if self.faction and self.faction.noHair then
self:CreateRightMenuTextPanel("Wybór włosów nie jest dostępny dla tej frakcji", 60)
return
end
self:CreateRightMenuTextPanel("wybór włosów", 60)
if self.hairButtonList then self.hairButtonList = {} end
local hairButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(hairButtonPanel)
self:CreateBodyGroupButtons(hairButtonPanel, "hair", 1, 8)
local hairButtonPanel2 = self.rightCreation:Add("Panel")
self:CreateButtonPanel(hairButtonPanel2)
hairButtonPanel2:DockMargin(0, padding, 0, 0)
self:CreateBodyGroupButtons(hairButtonPanel2, "hair", 9, 15)
if self.payload.gender == "male" and self.faction.index != FACTION_VORT then
self:CreateRightMenuTextPanel("beard", 20)
self.beardButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(self.beardButtonPanel)
self:RefreshBeards()
end
local chooseColorText = self:CreateRightMenuTextPanel("wybierz kolor", 30)
chooseColorText:SetFont("LargerTitlesFontNoClamp")
chooseColorText:SetTextColor(Color(255, 204, 0, 255))
chooseColorText:SizeToContents()
local colorButtonList = {}
for name, tColors in pairs(ix.allowedHairColors) do
self:CreateRightMenuTextPanel(name, 15)
local colorButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(colorButtonPanel, 0)
for _, color in pairs(tColors) do
local colorButton = colorButtonPanel:Add("DButton")
colorButton:Dock(LEFT)
colorButton:SetWide(math.Round(self.rightCreation:GetWide() / 8 - padding))
colorButton:SetText("")
colorButton:DockMargin(0, 0, padding, 0)
colorButton.color = color
colorButton.Paint = function(_, w, h)
surface.SetDrawColor(color)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(self.payload.hair.color == color and Color(255, 204, 0, 255) or Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawOutlinedRect(0, 0, w, h)
end
colorButton.DoClick = function()
if self.characterModel and IsValid(self.characterModel) then
if !self.characterModel.overrideProxyColors then self.characterModel.overrideProxyColors = {} end
self.characterModel.overrideProxyColors["HairColor"] = Vector(color.r / 255, color.g / 255, color.b / 255)
end
for _, v in pairs(colorButtonList) do
v.Paint = function(this, w, h)
surface.SetDrawColor(v.color)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(v == colorButton and Color(255, 204, 0, 255) or Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawOutlinedRect(0, 0, w, h)
end
end
self.payload:Set("hair", {hair = self.payload.hair.hair, color = color})
end
colorButtonList[#colorButtonList + 1] = colorButton
end
end
self:CreateFinishPanel(self.appearancesButton, self.faceButton)
end
end
-- A function to create the clothing button on the left side menu
function PANEL:CreateFaceButton()
self.faceButton = self.leftCreation:Add("DButton")
self:CreateMainButton(self.faceButton, "ubrania", "clothes")
self.faceButton.DoClick = function()
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.faceButton, "clothes", true)
surface.PlaySound(table.Random(self.randomClickSounds))
if self.faction:GetNoAppearances(LocalPlayer()) != true and self.faction.index != FACTION_VORT then
self:CreateRightMenuTextPanel("wybór kurtki", 60)
local jacketButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(jacketButtonPanel)
self:CreateBodyGroupButtons(jacketButtonPanel, "torso")
self:CreateRightMenuTextPanel("wybór spodni", 30)
local trouserButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(trouserButtonPanel)
self:CreateBodyGroupButtons(trouserButtonPanel, "legs")
self:CreateRightMenuTextPanel("wybór butów", 30)
local shoesButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(shoesButtonPanel)
self:CreateBodyGroupButtons(shoesButtonPanel, "shoes")
self:CreateRightMenuYellowTextPanel("Nową odzież można kupić w sklepach", 10)
else
self:CreateRightMenuTextPanel("Wygląd", 60)
local noAppearances = self.rightCreation:Add("Panel")
noAppearances:Dock(TOP)
noAppearances:DockMargin(0, 0 - SScaleMin(1 / 3), 0, 0)
noAppearances:SetTall(SScaleMin(140 / 3))
noAppearances.Paint = function(_, 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
local noAppearancesAvailable = noAppearances:Add("DLabel")
noAppearancesAvailable:Dock(FILL)
noAppearancesAvailable:SetFont("MenuFontNoClamp")
noAppearancesAvailable:SetText("Wybór odzieży nie jest dostępny dla tej frakcji")
noAppearancesAvailable:SetContentAlignment(5)
end
self:CreateFinishPanel(self.hairButton, self.attributesButton)
end
end
-- A function to create a background selection panel
function PANEL:CreateBackgroundSelectionPanels(icon, iconW, iconH, title, desc, minusMargin, difficultyText)
iconW = SScaleMin(iconW / 3)
iconH = SScaleMin(iconH / 3)
local backgroundPanel = self.rightCreation:Add("DSizeToContents")
backgroundPanel:Dock(TOP)
backgroundPanel:DockPadding(SScaleMin(90 / 3), padding, padding, SScaleMin(15 / 3))
backgroundPanel:DockMargin(0, 0 - SScaleMin(1 / 3), 0, 0)
backgroundPanel:SetSizeX( false )
backgroundPanel:InvalidateLayout()
backgroundPanel.Paint = function(_, 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)
surface.SetDrawColor(color_white)
surface.SetMaterial(Material(icon))
surface.DrawTexturedRect(SScaleMin(90 / 3) * 0.5 - iconW * 0.5, h * 0.5 - iconH * 0.5, iconW, iconH)
end
local textPanel = backgroundPanel:Add("DSizeToContents")
textPanel:Dock(TOP)
textPanel:SetSizeX( false )
local titleText = textPanel:Add("DLabel")
titleText:SetText(title)
titleText:SetFont("LargerTitlesFontNoClamp")
titleText:SizeToContents()
titleText:Dock(TOP)
titleText:SetTextColor(Color(255, 204, 0, 255))
local descText = textPanel:Add("DLabel")
descText:SetText(desc)
descText:SetFont("MenuFontNoClamp")
descText:SetWrap(true)
descText:SetAutoStretchVertical(true)
descText:Dock(TOP)
if difficultyText then
local textDifficulty = textPanel:Add("DLabel")
textDifficulty:Dock(TOP)
textDifficulty:SetText(difficultyText)
textDifficulty:SetFont("MenuFontNoClamp")
textDifficulty:SetWrap(true)
textDifficulty:SetAutoStretchVertical(true)
textDifficulty:DockMargin(0, padding, 0, 0)
if string.match(difficultyText, "Hard") then
textDifficulty:SetTextColor(Color(255, 78, 69, 255))
elseif string.match(difficultyText, "To tło zaczyna bez identyfikatora CID.") then
textDifficulty:SetTextColor(Color(236, 218, 101, 255))
else
textDifficulty:SetTextColor(Color(101, 235, 130, 255))
end
end
local function PaintSelected(w, h)
local color = ix.config.Get("color", color_white)
surface.SetDrawColor(color.r, color.g, color.b, 200)
for i = 1, 2 do
local i2 = i * 2
surface.DrawOutlinedRect(i, i, w - i2, h - i2)
end
end
local buttonCover = self.rightCreation:Add("DButton")
buttonCover:Dock(TOP)
buttonCover.PerformLayout = function()
buttonCover:SetWide(backgroundPanel:GetWide())
buttonCover:SetTall(backgroundPanel:GetTall())
buttonCover:DockMargin(0, 0 - backgroundPanel:GetTall(), 0, 0)
end
buttonCover:SetSize(SScaleMin(100 / 3), SScaleMin(100 / 3))
buttonCover.Paint = function(selfButton, w, h)
if self.payload.data["background"] == title then
PaintSelected(w, h)
end
end
buttonCover:SetText("")
table.insert(self.backgroundButtonList, buttonCover)
buttonCover.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
end
buttonCover.DoClick = function()
self.payload.data["background"] = title
surface.PlaySound("helix/ui/press.wav")
for _, v in pairs(self.backgroundButtonList) do
v.Paint = nil
end
buttonCover.Paint = function(_, w, h)
PaintSelected(w, h)
end
self:CheckIfFinished()
end
end
-- Util Functions
function PANEL:AttributesRefresh(attribute, number, bSkill)
bSkill = bSkill or false
if !bSkill then
self.payload.special[attribute] = number
else
self.payload.skill[attribute] = number
end
self.attributesRemaining:SetText(self:GetPointsLeft(bSkill)..string.utf8upper(" pozostałych punktów"))
self.attributesRemaining:SizeToContents()
end
function PANEL:GetPointsSpend(bSkill)
local pointsSpend = 0
if !bSkill then
for _, v in pairs(self.payload.special) do
pointsSpend = pointsSpend + v
end
else
for _, v in pairs(self.payload.skill) do
pointsSpend = pointsSpend + v
end
end
return pointsSpend
end
function PANEL:GetPointsLeft(bSkill)
return self:GetMaxAttributePoints(bSkill) - self:GetPointsSpend(bSkill)
end
function PANEL:GetFactionModelsGender(faction)
if self.payload.gender == "male" and faction:GetModelsMale(LocalPlayer()) then
return faction:GetModelsMale(LocalPlayer())
elseif self.payload.gender == "female" and faction:GetModelsFemale(LocalPlayer()) then
return faction:GetModelsFemale(LocalPlayer())
else
return faction:GetModels(LocalPlayer())
end
end
function PANEL:ClearSelectedSkins()
for _, v in pairs(self.skinButtonList) do
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, false)
end
end
end
function PANEL:CheckForSkinCount(k)
for _, v2 in pairs(self.skinButtonList) do
if v2.name == 1 then
self:SetButtonSelected(v2, k, false)
end
end
end
function PANEL:GetActiveSkinEyeColorTable()
local entityModel = self.characterModel.Entity:GetModel()
local vortEyeRedSkins = { 0, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56 }
local vortEyeYellowSkins = { 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59 }
local vortEyeOrangeSkins = { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 }
if (string.match(entityModel, "vortigaunt")) then
local activeEyeColor = vortEyeRedSkins
if self.payload.data["eye color"] == "ŻÓŁTE" then
activeEyeColor = vortEyeYellowSkins
end
if self.payload.data["eye color"] == "POMARAŃCZOWE" then
activeEyeColor = vortEyeOrangeSkins
end
return activeEyeColor
end
local eyeColorBrownSkins = { 0, 1, 2, 3, 4 }
local eyeColorBlueSkins = { 5, 6, 7, 8, 9 }
local eyeColorGreenSkins = { 10, 11, 12, 13, 14 }
if (string.match(entityModel, "/male02")) then
eyeColorBrownSkins = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }
eyeColorBlueSkins = { 9, 10, 11, 12, 13, 14, 15, 16, 17 }
eyeColorGreenSkins = { 18, 19, 20, 21, 22, 23, 24, 25, 26 }
end
if (string.match(entityModel, "/male06")) then
eyeColorBrownSkins = { 0, 1, 2, 3, 4, 5 }
eyeColorBlueSkins = { 6, 7, 8, 9, 10, 11 }
eyeColorGreenSkins = { 12, 13, 14, 15, 16, 17 }
end
if (string.match(entityModel, "/male07")) then
eyeColorBrownSkins = { 0, 1, 2, 3, 4, 5, 6 }
eyeColorBlueSkins = { 7, 8, 9, 10, 11, 12, 13 }
eyeColorGreenSkins = { 14, 15, 16, 17, 18, 19, 20 }
end
if (string.match(entityModel, "/male10")) then
eyeColorBrownSkins = { 0 }
eyeColorBlueSkins = { 1 }
eyeColorGreenSkins = { 2 }
end
if (string.match(entityModel, "/female_03")) then
eyeColorBrownSkins = { 0, 1, 2, 3 }
eyeColorBlueSkins = { 4, 5, 6, 7 }
eyeColorGreenSkins = { 8, 9, 10, 11 }
end
local activeEyeColor = eyeColorBrownSkins
if self.payload.data["eye color"] == "NIEBIESKIE" or self.payload.data["eye color"] == "SZARE" then
activeEyeColor = eyeColorBlueSkins
end
if self.payload.data["eye color"] == "ZIELONE" then
activeEyeColor = eyeColorGreenSkins
end
if self.payload.data["eye color"] == "PIWNE" or self.payload.data["eye color"] == "BRĄZOWE"
or self.payload.data["eye color"] == "BURSZTYNOWE" then
activeEyeColor = eyeColorBrownSkins
end
return activeEyeColor
end
function PANEL:ResetClothingInfo()
end
function PANEL:SetStandardFactionInfo(panel)
self.faction = ix.faction.indices[panel.faction]
self.torsoBodygroups = "2"
self.legsBodygroups = "3"
self.shoesBodygroups = "4"
self.hairBodygroups = "10"
self.beardBodygroups = "11"
self.payload:Set("faction", panel.faction)
self.payload:Set("model", 1)
self.payload:Set("gender", "female")
self.payload:Set("data", {})
self.payload.data["languages"] = nil
self.payload:Set("hair", {hair = 0, color = Color(244,233,230)})
if self.characterModel and IsValid(self.characterModel) then
self.characterModel.overrideProxyColors = {}
self.characterModel.overrideProxyColors["HairColor"] = Vector(244 / 255, 233 / 255, 230 / 255)
end
if self.faction:GetModelsFemale(LocalPlayer()) then
self.characterModel:SetModel(self.faction:GetModelsFemale(LocalPlayer())[1] or "models/willardnetworks/citizens/female_01.mdl")
local model = self.characterModel:GetModel()
if model:find("models/willardnetworks/citizens/") then
if ix.faction.indices[panel.faction].index == FACTION_CP then
model = self.characterModel:GetModel()
if model then
model = string.Replace(model, "models/willardnetworks/citizens/", "models/wn7new/metropolice/")
if self.payload.gender == "male" then
model = string.Replace(model, "male", "male_")
end
self.characterModel:SetModel(model)
end
end
end
end
self.payload.data["age"] = ""
self.payload.data["height"] = ""
self.payload.data["eye color"] = ""
self.torsoBodygroups = "2"
self.legsBodygroups = "3"
self.shoesBodygroups = "4"
self.hairBodygroups = "10"
self.beardBodygroups = "11"
self.payload.data["groups"] = {}
self.payload.data["skin"] = 0
self.payload.data["chosenClothes"] = {}
self.payload.data.chosenClothes[self.beardBodygroups] = 0
self:ResetClothingInfo()
self.payload.data["glasses"] = false
self.payload.data["canread"] = true
self.payload:Set("special", {})
self.payload.special["strength"] = 0
self.payload.special["perception"] = 0
self.payload.special["agility"] = 0
self.payload.special["intelligence"] = 0
self.payload:Set("skill", {})
self.payload.data["background"] = ""
end
function PANEL:CheckIfFinished(name)
for k, v in SortedPairsByMemberValue(ix.char.vars, "index") do
if (name ~= nil and (v.category or "character") != name) then
continue
end
local value = self.payload[k]
if (!v.bNoDisplay or v.OnValidate) then
if (v.OnValidate) then
local result = {v:OnValidate(value, self.payload, LocalPlayer())}
if (result[1] == false) then
if IsValid(self.finishButton) then
self.finishButton:SetTextColor(Color(255, 255, 255, 30))
self.finishButton.Paint = function(_, w, h)
self:DrawFinishButtonNonAvailable(w, h)
end
end
return false
end
end
end
end
if IsValid(self.finishButton) then
self.finishButton:SetTextColor(color_white)
self.finishButton.Paint = function(_, w, h)
self:DrawFinishButtonAvailable(w, h)
end
self.finishButton.DoClick = function()
surface.PlaySound("willardnetworks/charactercreation/final.wav")
self:SendPayload()
end
end
return true
end
function PANEL:GetWhitelistFactions()
local Count = 0
for _, v in pairs(ix.faction.teams) do
if (ix.faction.HasWhitelist(v.index)) then
Count = Count + 1
end
end
return Count
end
function PANEL:ResetPanel()
self:ResetPayload(true)
self.repopulatePanels = {}
end
function PANEL:ClearSelectedMainButtons()
for _, v in pairs(self.mainButtonList) do
v:SetTextColor(Color(200, 200, 200, 255))
v.Paint = function(this, w, h)
self:DrawButtonUnselected(v.name, this, w, h, true)
end
end
for _, v in pairs(self.rightCreation:GetChildren()) do
v:SetVisible(false)
end
if IsValid(self.dropdownMenu) then
self.dropdownMenu:Remove()
end
end
function PANEL:ResetModelCam()
self.characterModel:SetFOV(26)
self.characterModel:SetCamPos(self.originPos)
self.characterModel:SetLookAt(self.originLookAt)
end
-- Paint Functions
function PANEL:SetButtonSelected(parent, text, boolMainButton)
parent:SetTextColor(color_white)
parent.Paint = function(this, w, h)
self:DrawButtonSelected(text, this, w, h, boolMainButton)
end
end
function PANEL:DrawRoundedBox(parent, w, h, alpha)
draw.RoundedBox( 10, 0, 0, parent:GetWide(), parent:GetTall(), Color(78, 79, 100, alpha) )
end
function PANEL:FadeInBars()
ix.gui.blackBarBottom:ColorTo( Color(0, 0, 0, 255), 1, 1 )
ix.gui.blackBarTop:ColorTo( Color(0, 0, 0, 255), 1, 1 )
ix.gui.blackBarTop:SetVisible(true)
ix.gui.blackBarBottom:SetVisible(true)
end
function PANEL:Dim(length, callback)
local animationTime = 1
self.currentDimAmount = 0
self.currentY = 0
self.currentScale = 1
self.currentAlpha = 255
self.targetDimAmount = 255
self.targetScale = 0.9
length = length or animationTime
self.currentDimAmount = 0
self:CreateAnimation(length, {
target = {
currentDimAmount = self.targetDimAmount,
currentScale = self.targetScale,
OnComplete = callback
},
easing = "outCubic"
})
end
function PANEL:DrawFinishButtonAvailable(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)
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/tick.png"))
surface.DrawTexturedRect(w - SScaleMin(15 / 3) - padding, h * 0.5 - SScaleMin(36 / 3) * 0.5, SScaleMin(15 / 3), SScaleMin(36 / 3))
end
function PANEL:DrawFinishButtonNonAvailable(w, h)
surface.SetDrawColor(255, 255, 255, 5)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(255, 255, 255, 30)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/tick.png"))
surface.DrawTexturedRect(w - SScaleMin(15 / 3) - padding, h * 0.5 - SScaleMin(36 / 3) * 0.5, SScaleMin(15 / 3), SScaleMin(36 / 3))
end
function PANEL:DrawButtonUnselected(text, this, w, h, bMainButton)
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)
if bMainButton then
if this:IsHovered() then
this:SetTextColor(color_white)
surface.SetDrawColor(color_white)
else
this:SetTextColor(Color(200, 200, 200, 255))
surface.SetDrawColor(Color(255, 255, 255, 160))
end
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/"..text..".png"))
surface.DrawTexturedRect(SScaleMin(9 / 3), SScaleMin(9 / 3), margin, margin)
end
end
function PANEL:DrawButtonSelected(text, this, w, h, bMainButton)
surface.SetDrawColor(Color(255, 78, 69, 255))
surface.DrawRect(0, 0, w, h)
if bMainButton then
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/"..text..".png"))
surface.DrawTexturedRect(SScaleMin(9 / 3), SScaleMin(9 / 3), margin, margin)
end
end
function PANEL:Paint(width, height)
surface.SetDrawColor(255, 255, 255, 0)
surface.DrawTexturedRect(0, 0, width, height)
BaseClass.Paint(self, width, height)
end
vgui.Register("ixCharMenuNew", PANEL, "ixCharMenuPanel")