mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
2863 lines
92 KiB
Lua
2863 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("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")
|