Files
wnsrc/gamemodes/helix/plugins/willardinterface/derma/cl_charcreate.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

2854 lines
92 KiB
Lua

--[[
| 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("Factions"))
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(" Retour"))
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, "background")
self.backgroundButton.DoClick = function()
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.backgroundButton, "background", true)
surface.PlaySound(table.Random(self.randomClickSounds))
self:CreateRightMenuTextPanel("background", 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 == "Citoyen" then
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/relocatedcitizen.png", 45, 61, "Citoyen Relocalisé", "Vous venez d'arriver dans cette nouvelle ville, inconnue. Pas de famille, pas de contacts, juste un autre anonyme descendant du train pour commencer une nouvelle vie.", -5, "Bien pour les nouveaux joueurs.")
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Citoyen Local", "Vous vivez ici depuis un bon moment, peut-être même depuis avant l'occupation. D'une manière ou d'une autre, vous avez eu de la chance et n'avez jamais été déplacé. À présent, vous connaissez la ville dans ses moindres détails.", 0)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Citoyen Loyal", "Pour une raison ou une autre, vous avez accepté l'autorité de l'Union, suivez leurs règles et essayez de répondre à leurs attentes. Certains citoyens pourraient ne pas voir d'un bon œil votre collaboration.", 0)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/outcast.png", 55, 55, "Nomade", "Toujours en mouvement, toujours en cachette. Évitant le regard de l'Union. Vous vivez de vos propres moyens dans les taudis, pour le meilleur ou pour le pire.", 5)
elseif self.faction.name == "Vortigaunt" then
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Biotique", "Asservi, libéré, puis asservi à nouveau. Avec un collier autour de votre cou et la botte de l'Union sur vous, vous devez endurer la torture. Vous, et des milliers d'autres.", 13, "Choisissez celui-ci à moins que vous n'ayez la permission d'utiliser d'autres contextes.")
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Libéré", "Autrefois asservi, désormais libre. Vous avez vécu sous la botte de l'Union, mais ce n'est plus le cas. Soyez prudent, car l'Union a déjà goûté à votre sang et ne fera pas preuve de clémence si elle vous retrouve à nouveau...", 13, "Difficulté élevée - Ne l'utilisez pas sans permission.")
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/outcast.png", 55, 55, "Sauvage", "Vous avez été l'un des rares vortigaunts chanceux à n'avoir jamais été capturé par l'Union. La dernière chaîne autour de votre cou était celle du Nihilanth. L'Union ne sait pas que vous existez.", 15, "Ne l'utilisez pas sans permission.", nil, true)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Collaborateur", "Un traître au peuple vortigaunt qui s'est permis les luxes que l'Union a trompeusement offerts, vous avez ainsi pris le statut de Collaborateur.", 13, "Ne l'utilisez pas sans permission. Ce background commence avec un CID et 50 points de cohésion ainsi qu'une belle paire de pantalons et aucune chaîne.", nil, true)
elseif self.faction.name == "Union des Travailleurs Civils" then
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/relocatedcitizen.png", 45, 61, "Worker", "You are a worker for the Civil Workers Union under the Combine occupation. You spend your time cleaning infestation or repairing infrastructure.", -8)
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Medic", "You are a medic for Civil Medical Union. Your job is to heal the populace, or if you get lucky, operate on both Vortiguants and Civil Protection. Do your duty.", -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("Sélection de background non disponible pour cette faction")
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("Attribute Levels: +"..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, "attributs")
self.attributesButton.DoClick = function()
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.attributesButton, "attributs", 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("sélection d'attributs"))
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("Aucun attribut disponible pour cette faction.")
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(" points restants"))
self.attributesRemaining:SizeToContents()
self:CreateAttribute("willardnetworks/mainmenu/charcreation/strength.png", 45, 61, "Force", "Boost majeur aux armes \nBoost mineur a la vitesse et au craft", "strength")
self:CreateAttribute("willardnetworks/mainmenu/charcreation/perception.png", 45, 30, "Perception", "Boost majeur a la cuisine \nBoost mineur a la contrebande et aux armes", "perception")
self:CreateAttribute("willardnetworks/mainmenu/charcreation/agility.png", 38, 47, "Agilité", "Boost majeur a la contrebande et la vitesse \nBoost mineur a la médecine", "agility")
self:CreateAttribute("willardnetworks/mainmenu/charcreation/intelligence.png", 48, 29, "Intelligence", "Boost majeur au craft et a la médecine \nBoost mineur a la cuisine", "intelligence")
self:CreateRightMenuYellowTextPanel("Les attributs restent permanents et ne peuvent être temporairement améliorés qu'avec des objets.", 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, "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("skills"))
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(" points restants"))
self.attributesRemaining:SizeToContents()
local attributes = ix.special.list or {}
for skillID, skillInfo in pairs(ix.skill.list) do
if (skillInfo.name == "Vortessence" and self.faction.name != "Vortigaunt") or skillInfo.name == "Commerce" 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("Skills have a maximum level of 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("new", 0, 0)
self:CreateCreationTitle("character", SScaleMin((0 - 5) / 3), padding)
end
-- A function to create a button in the left menu
function PANEL:CreateMainButton(parent, text)
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)
parent.name = text
parent.OnCursorEntered = function()
surface.PlaySound("willardnetworks/charactercreation/hover.wav")
end
parent.Paint = function(this, w, h)
self:DrawButtonUnselected(text, this, w, h, true)
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(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(text))
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(text))
end
parent.OnCursorExited = function()
parent:SetText(string.utf8upper(savedText))
end
parent.DoClick = function()
if text == "couleur des yeux" 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 == "langues" then
local languageText = v != "none" 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 == "couleur des yeux" then
local eyeColorTable = self:GetActiveSkinEyeColorTable()
self.characterModel.Entity:SetSkin(eyeColorTable[1] or 0)
self.payload.data["skin"] = eyeColorTable[1]
end
if text == "langues" and v != "none" 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("retour"))
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("suivant"))
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("terminer"))
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, "identité")
self.characterButton.DoClick = function()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.characterButton, "identité", true)
if ix.panelCreationActive == true then
surface.PlaySound(table.Random(self.randomClickSounds))
end
self:CreateRightMenuTextPanel(self.faction:GetNoGender(LocalPlayer()) != true and "nom/sexe" or "nom", 60)
-- Name
local nameGenderPanel = self.rightCreation:Add("DTextEntry")
self:CreateRightMenuTextEntry(nameGenderPanel, "Entrer votre nom ici...", 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("Votre nom doit avoir un minimum de "..minLength.." caractère ("..string.len(self.payload.name or "").." / "..maxLength..")", -1)
nameGenderPanel.OnTextChanged = function(this)
self.payload:Set("name", this:GetValue())
self:CheckIfFinished()
namewarning:SetText("Votre nom doit avoir un minimum de "..minLength.." caractère ("..string.len(this:GetValue() or "").." / "..maxLength..")")
namewarning:SizeToContents()
end
if self.faction:GetNoGenetics(LocalPlayer()) != true then
-- Genetics
self:CreateRightMenuTextPanel("Description Génétique", 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(ageComboBox, 148, "age", {"jeune (0 - 100)", "jeune adulte (100 - 500)", "adulte (500 - 1000)", "sage (1000 - 1500)", "ancien (1500 - 2000)"})
else
self:CreateSelectionMenu(ageComboBox, 100, "age", {"~20 ans", "~30 ans", "~40 ans", "~50 ans"})
end
local heightComboBox = comboBoxPanel:Add("DButton")
if self.faction.name == "Protection Civile" then
self:CreateSelectionMenu(heightComboBox, 90, "height", {"~1m65", "~1m70", "~1m75", "~1m80", "~1m85", "~1m90"})
elseif self.faction.name == "Vortigaunt" then
self:CreateSelectionMenu(heightComboBox, 148, "height", {"~1m65", "~1m70", "~1m75", "~1m80", "~1m85", "~1m90", "~1m95", "~2m"})
else
self:CreateSelectionMenu(heightComboBox, 90, "height", {"~1m65", "~1m70", "~1m75", "~1m80", "~1m85", "~1m90"})
end
local eyeColorBox = comboBoxPanel:Add("DButton")
if self.faction.name == "Vortigaunt" then
self:CreateSelectionMenu(eyeColorBox, 146, "couleur des yeux", {"rouge", "jaune", "orange"})
else
self:CreateSelectionMenu(eyeColorBox, 110, "couleur des yeux", {"bleus", "verts", "marrons", "noisettes", "ambres", "gris"})
end
self:CreateRightMenuYellowTextPanel("Les valeurs de description génétique restent permanentes.", 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, "none")
self:CreateRightMenuTextPanel("seconde langue", 10)
local languageBoxPanel = self.rightCreation:Add("Panel")
languageBoxPanel:Dock(TOP)
languageBoxPanel:SetTall(SScaleMin(36 / 3))
local languageComboBox = languageBoxPanel:Add("DButton")
self:CreateSelectionMenu(languageComboBox, 110, "langues", languages)
end
-- Description
self:CreateRightMenuTextPanel("description physique", 20)
local charDescPanel = self.rightCreation:Add("DTextEntry")
self:CreateRightMenuTextEntry(charDescPanel, "Décrivez ici l'apparence physique de votre personnage...", 130, true, 1000, "desc")
local minDescLength = ix.config.Get("minDescriptionLength", 16)
local maxDescLength = ix.config.Get("maxDescriptionLength", 512)
local descLength = self:CreateRightMenuYellowTextPanel("Votre description doit avoir un minimum de "..minDescLength.." caractères ("..string.len(self.payload.description or "").." / "..maxDescLength..")", -1)
charDescPanel.OnTextChanged = function(this)
self.payload:Set("description", this:GetValue())
self:CheckIfFinished()
descLength:SetText("Votre description doit avoir un minimum de "..minDescLength.." caractères ("..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("NON")
else
glassesButton:SetText("OUI")
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, "OUI", false)
elseif self.payload.data.glasses == false and i == 1 then
self:SetButtonSelected(glassesButton, "NON", 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("AUCUNE BARBE")
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, "apparence")
self.appearancesButton.DoClick = function()
local faction = ix.faction.indices[self.payload.faction]
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.appearancesButton, "apparence", true)
surface.PlaySound(table.Random(self.randomClickSounds))
self:CreateRightMenuTextPanel("Selection de l'apparence", 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("Votre apparence est permanante alors choissisez bien", 10)
if faction:GetNoAppearances(LocalPlayer()) != true then
self:CreateRightMenuTextPanel((faction.index == FACTION_VORT and "skin color/wrinkles" or "facial features"), 10)
self.skinButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(self.skinButtonPanel)
if faction.index != FACTION_VORT then
self:CreateRightMenuTextPanel("Avec vous besoin de lunettes?", 20)
self.glassesButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(self.glassesButtonPanel)
self:CreateRightMenuYellowTextPanel("Votre vue ne seras pas flou a moins que vous l'activer dans les paramètres", 10)
end
self:RefreshSkins()
end
if !faction.ReadOptionDisabled then
self:CreateRightMenuTextPanel("Can you read?", 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("NO")
else
canreadButton:SetText("YES")
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("Les livres, etc. les mots seront mélangés mais conserveront une sorte de lisibilité si NON", 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, "cheveux")
self.hairButton.DoClick = function()
self.beardButtonList = {}
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.hairButton, "cheveux", true)
surface.PlaySound(table.Random(self.randomClickSounds))
if self.faction and self.faction.noHair then
self:CreateRightMenuTextPanel("This faction does not allow for hair!", 60)
return
end
self:CreateRightMenuTextPanel("Selection des cheveux", 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("Choissisez la couleur", 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, "vêtements")
self.faceButton.DoClick = function()
self:ResetModelCam()
self:ClearSelectedMainButtons()
self:SetButtonSelected(self.faceButton, "vêtements", true)
surface.PlaySound(table.Random(self.randomClickSounds))
if self.faction:GetNoAppearances(LocalPlayer()) != true and self.faction.index != FACTION_VORT then
self:CreateRightMenuTextPanel("veste", 60)
local jacketButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(jacketButtonPanel)
self:CreateBodyGroupButtons(jacketButtonPanel, "torso")
self:CreateRightMenuTextPanel("pantalon", 30)
local trouserButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(trouserButtonPanel)
self:CreateBodyGroupButtons(trouserButtonPanel, "legs")
self:CreateRightMenuTextPanel("chaussures", 30)
local shoesButtonPanel = self.rightCreation:Add("Panel")
self:CreateButtonPanel(shoesButtonPanel)
self:CreateBodyGroupButtons(shoesButtonPanel, "shoes")
self:CreateRightMenuYellowTextPanel("D'autre vêtements peuvent être acheter dans des magasins", 10)
else
self:CreateRightMenuTextPanel("Appearances", 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("No Clothing Selection Available for this faction")
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, "This background starts with no 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(" points restants"))
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["couleur des yeux"] == "JAUNE" then
activeEyeColor = vortEyeYellowSkins
end
if self.payload.data["couleur des yeux"] == "ORANGE" 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["couleur des yeux"] == "BLEUS" or self.payload.data["couleur des yeux"] == "GRIS" then
activeEyeColor = eyeColorBlueSkins
end
if self.payload.data["couleur des yeux"] == "VERTS" then
activeEyeColor = eyeColorGreenSkins
end
if self.payload.data["couleur des yeux"] == "NOISETTES" or self.payload.data["couleur des yeux"] == "MARRONS"
or self.payload.data["couleur des yeux"] == "AMBRES" 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["couleur des yeux"] = ""
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")