mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
2862 lines
92 KiB
Lua
2862 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/")
|
||
if self.payload.gender == "male" then
|
||
model = string.Replace(model, "male", "male_")
|
||
end
|
||
|
||
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("Gruplar"))
|
||
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("Back"))
|
||
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, "hikaye", "background")
|
||
self.backgroundButton.DoClick = function()
|
||
self:ResetModelCam()
|
||
|
||
self:ClearSelectedMainButtons()
|
||
self:SetButtonSelected(self.backgroundButton, "background", true)
|
||
surface.PlaySound(table.Random(self.randomClickSounds))
|
||
|
||
self:CreateRightMenuTextPanel("hikaye seçimi", 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 == "Citizen" then
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/relocatedcitizen.png", 45, 61, "Yeniden Konumlandırılmış", "Bu yeni, tanımadığınız şehre yeni geldiniz. Aileniz yok, bağlantılarınız yok, sadece yeni bir hayata başlamak için trenden inen başka bir hiçsiniz.", -5, "Yeni oyuncular için ideal")
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Yerli", "Uzun süredir burada yaşıyorsunuz, belki de işgal öncesinden beri. Bir şekilde şansınız yaver gitti ve hiç yeriniz değiştirilmedi. Artık şehrin içini dışını biliyorsunuz.", 0)
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Destekçi", "Şu ya da bu nedenle, Birliğin otoritesini kabul ettiniz, kurallarına uydunuz ve beklentilerini karşılamaya çalıştınız. Bazı vatandaşlar işbirliğinizi hoş karşılamayabilir.", 0)
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/outcast.png", 55, 55, "Kaçkın", "Her zaman hareket halinde, her zaman saklanıyor. Combine'ın gözünden kaçıyorsunuz. Varoşlarda kendi imkanlarınızla yaşıyorsunuz, iyi ya da kötü.", 5)
|
||
elseif self.faction.name == "Vortigaunt" then
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "Biyotik", "Köleleştirildiniz, serbest bırakıldınız ve bir kez daha köleleştirildiniz. Boynunuzda bir tasma ve üzerinizde Combine'ın çizmeleriyle işkenceye katlanmak zorundasınız. Sen ve diğer binlercesi.", 13, "Diğer arka planları kullanmak için izniniz yoksa bunu seçin.")
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Kurtarılmış", "Bir kez köleleştirildiniz, tekrar özgürsünüz. Combine'ın çizmesi altında yaşadınız, ama artık değil. Dikkatli olun, çünkü Combine daha önce kanınızı tattı ve sizi tekrar bulurlarsa hoşgörü göstermeyeceklerdir...", 13, "Zor zorluk derecesi - İzniniz olmadığı sürece bunu kullanmayın.")
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/outcast.png", 55, 55, "Özgür", "Combine tarafından hiç ele geçirilmemiş şanslı birkaç vortigaunttan biriydin. Boynunuzdaki son zincir Nihilanth'ın zinciriydi. Combine senin varlığından haberdar değil.", 15, "İzniniz olmadığı sürece bunu kullanmayın.", nil, true)
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/supporter.png", 53, 68, "İşbirlikçi", "Combine'ın hilekârca sunduğu lükslere izin veren bir Vortkind haini olarak, İşbirlikçi statüsünü aldınız.", 13, "İzniniz olmadığı sürece bunu kullanmayın. Bu arka plan bir CID ve 50 Uyum Puanı ile birlikte güzel bir pantolon ve pranga olmadan başlar", nil, true)
|
||
elseif self.faction.name == "Civil Workers Union" then
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/relocatedcitizen.png", 45, 61, "İşçi", "Combine mesleği altında Sivil İşçiler Sendikası için çalışan bir işçisiniz. Zamanınızı istilayı temizleyerek veya altyapıyı onararak geçiriyorsunuz.", -8)
|
||
self:CreateBackgroundSelectionPanels("willardnetworks/mainmenu/charcreation/local.png", 34, 61, "Sıhhiye", "Sivil Tıp Birliği için çalışan bir sıhhiyecisiniz. Göreviniz halkı iyileştirmek ya da şansınız yaver giderse hem Vortiguantları hem de Sivil Korumayı ameliyat etmek. Görevinizi yapın.", -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("Grubunuz için hikaye seçimi mevcut değildir")
|
||
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("Nitelik Seviyeleri: +"..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, "nitelikler", "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("nitelik seçimi"))
|
||
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("Grubunuz için nitelik seçme mevcut değil")
|
||
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(" puan kaldı"))
|
||
self.attributesRemaining:SizeToContents()
|
||
|
||
self:CreateAttribute("willardnetworks/mainmenu/charcreation/strength.png", 45, 61, "güç", "Silahlara büyük takviye \nHız & Zanaatkarlığa küçük takviye", "strength")
|
||
self:CreateAttribute("willardnetworks/mainmenu/charcreation/perception.png", 45, 30, "algı", "Pişirmeye büyük takviye \nKaçakçılığa & Silahlara küçük takviye", "perception")
|
||
self:CreateAttribute("willardnetworks/mainmenu/charcreation/agility.png", 38, 47, "çeviklik", "Kaçakçılığa & Hıza büyük takviye \nTıp'a küçük takviye", "agility")
|
||
self:CreateAttribute("willardnetworks/mainmenu/charcreation/intelligence.png", 48, 29, "zeka", "Tıp & Zanaatkarlığa büyük takviye \nPişirmeye küçük takviye", "intelligence")
|
||
|
||
self:CreateRightMenuYellowTextPanel("Nitelikler kalıcıdır ve sadece eşyalar sayesinde geçici olarak güçlendirilebilir", 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, "beceriler", "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("beceri seçimi"))
|
||
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(" puan kaldı"))
|
||
self.attributesRemaining:SizeToContents()
|
||
|
||
local attributes = ix.special.list or {}
|
||
|
||
for skillID, skillInfo in pairs(ix.skill.list) do
|
||
if (skillInfo.name == "Vortessence" and self.faction.name != "Vortigaunt") or skillInfo.name == "Takas" 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("Becerilerin maksimum seviye sınırı 50'dir", 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("yeni", 0, 0)
|
||
self:CreateCreationTitle("karakter", 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)
|
||
self:DrawButtonUnselected(text, this, w, h, true)
|
||
end
|
||
|
||
table.insert(self.mainButtonList, parent)
|
||
end
|
||
|
||
-- A function to draw the character model left of the creation
|
||
function PANEL:CreateCharacterModel()
|
||
self.characterModelList = self.panelCreation:Add("Panel")
|
||
self.characterModelList:SetSize(SScaleMin(400 / 3), ScrH())
|
||
self.characterModelList:Center()
|
||
|
||
self.characterModel = self.characterModelList:Add("ixModelPanel")
|
||
self.characterModel:Dock(FILL)
|
||
self.characterModel:SetModel("models/willardnetworks/citizens/female_01.mdl")
|
||
self.characterModel:SetFOV(26)
|
||
self.characterModel.PaintModel = self.characterModel.Paint
|
||
|
||
self.originPos = self.characterModel:GetCamPos()
|
||
self.originLookAt = self.characterModel:GetLookAt()
|
||
end
|
||
|
||
-- A function to create a panel for text in the right side panel
|
||
function PANEL:CreateRightMenuTextPanel(text, topMargin)
|
||
local textPanel = self.rightCreation:Add("Panel")
|
||
textPanel:Dock(TOP)
|
||
textPanel:SetTall(margin)
|
||
textPanel:DockMargin(0, SScaleMin(topMargin / 3), 0, padding)
|
||
|
||
local panelText = textPanel:Add("DLabel")
|
||
panelText:SetText(string.utf8upper(text))
|
||
panelText:SetFont("MenuFontNoClamp")
|
||
panelText:SizeToContents()
|
||
panelText:Dock(LEFT)
|
||
panelText:SetContentAlignment(4)
|
||
|
||
return panelText
|
||
end
|
||
|
||
-- A function to create a text entry in the right side panel
|
||
function PANEL:CreateRightMenuTextEntry(parent, text, height, boolMultiline, maxChars, name)
|
||
parent:Dock(TOP)
|
||
parent:SetTall(SScaleMin(height / 3))
|
||
parent:DockMargin(0, 0, 0, padding)
|
||
parent:SetMultiline( boolMultiline )
|
||
parent:SetVerticalScrollbarEnabled( boolMultiline )
|
||
parent:SetEnterAllowed( boolMultiline )
|
||
parent:SetTextColor(Color(200, 200, 200, 255))
|
||
parent:SetCursorColor(Color(200, 200, 200, 255))
|
||
parent:SetFont("MenuFontNoClamp")
|
||
parent:SetPlaceholderText(text or "")
|
||
parent:SetPlaceholderColor( Color(200, 200, 200, 255) )
|
||
if name == "name" then
|
||
parent:SetText(self.payload.name or "")
|
||
elseif name == "desc" then
|
||
parent:SetText(self.payload.description or "")
|
||
end
|
||
|
||
parent.Paint = function(this, w, h)
|
||
surface.SetDrawColor(Color(0, 0, 0, 100))
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||
surface.DrawOutlinedRect(0, 0, w, h)
|
||
|
||
if ( this.GetPlaceholderText and this.GetPlaceholderColor and this:GetPlaceholderText() and this:GetPlaceholderText():Trim() != "" and this:GetPlaceholderColor() and ( !this:GetText() or this:GetText() == "" ) ) then
|
||
|
||
local oldText = this:GetText()
|
||
|
||
local str = this:GetPlaceholderText()
|
||
if ( str:StartWith( "#" ) ) then str = str:utf8sub( 2 ) end
|
||
str = language.GetPhrase( str )
|
||
|
||
this:SetText( str )
|
||
this:DrawTextEntryText( this:GetPlaceholderColor(), this:GetHighlightColor(), this:GetCursorColor() )
|
||
this:SetText( oldText )
|
||
|
||
return
|
||
end
|
||
|
||
this:DrawTextEntryText( this:GetTextColor(), this:GetHighlightColor(), this:GetCursorColor() )
|
||
end
|
||
|
||
parent.MaxChars = maxChars
|
||
parent.OnTextChanged = function(parentSelf)
|
||
if name == "name" then
|
||
self.payload:Set("name", parentSelf:GetValue())
|
||
end
|
||
|
||
if name == "desc" then
|
||
self.payload:Set("description", parentSelf:GetValue())
|
||
end
|
||
|
||
self:CheckIfFinished()
|
||
end
|
||
end
|
||
|
||
-- A function to create a gender button inside a right side panel
|
||
function PANEL:CreateGenderButton(parent, icon, w, h, rightMargin, gender)
|
||
parent:SetSize( SScaleMin(w / 3), SScaleMin(h / 3) )
|
||
parent:SetImage( icon )
|
||
parent:Dock(RIGHT)
|
||
parent:DockMargin(0, 0, SScaleMin(rightMargin / 3), 0)
|
||
parent:SetColor(Color(150, 150, 150, 255))
|
||
|
||
if self.payload.gender != "male" and self.payload.gender != "female" then
|
||
self.payload:Set("gender", "female")
|
||
end
|
||
|
||
if gender == "male" and self.payload.gender == "male" then
|
||
parent:SetColor(Color(255, 204, 0, 255))
|
||
end
|
||
|
||
if gender == "female" and self.payload.gender == "female" then
|
||
parent:SetColor(Color(255, 204, 0, 255))
|
||
end
|
||
|
||
parent.OnCursorEntered = function()
|
||
surface.PlaySound("helix/ui/rollover.wav")
|
||
end
|
||
|
||
parent.DoClick = function()
|
||
|
||
surface.PlaySound("helix/ui/press.wav")
|
||
parent:SetColor(Color(255, 204, 0, 255))
|
||
|
||
if gender == "female" then
|
||
if self.genderButtonMale then
|
||
self.genderButtonMale:SetColor(Color(150, 150, 150, 255))
|
||
end
|
||
|
||
self.payload:Set("gender", "female")
|
||
self.payload:Set("model", 1)
|
||
else
|
||
if self.genderButtonFemale then
|
||
self.genderButtonFemale:SetColor(Color(150, 150, 150, 255))
|
||
end
|
||
|
||
self.payload:Set("gender", "male")
|
||
self.payload:Set("model", 1)
|
||
end
|
||
|
||
self:ResetModelCam()
|
||
|
||
local eyeColorTable = self:GetActiveSkinEyeColorTable()
|
||
|
||
self.characterModel.Entity:SetSkin(eyeColorTable[1] or 0)
|
||
self.payload.data["skin"] = eyeColorTable[1]
|
||
|
||
self.payload.data["groups"] = {}
|
||
self.payload.data["glasses"] = false
|
||
self.payload.data["canread"] = true
|
||
self.payload:Set("hair", {hair = 0, color = self.payload.hair.color})
|
||
|
||
self.payload.data.groups[self.beardBodygroups] = 0
|
||
self.payload.data.groups[self.hairBodygroups] = 0
|
||
|
||
self:CheckIfFinished()
|
||
end
|
||
end
|
||
|
||
-- A function to create a custom DComboBox
|
||
function PANEL:CreateSelectionMenu(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 != "yok" and ix.languages 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 != "yok" 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("back"))
|
||
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("next"))
|
||
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("finish"))
|
||
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, "karakter", "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 "isim/cinsiyet" or "isim", 60)
|
||
|
||
-- Name
|
||
local nameGenderPanel = self.rightCreation:Add("DTextEntry")
|
||
self:CreateRightMenuTextEntry(nameGenderPanel, "Adınızı giriniz...", 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("Adınız minimum "..minLength.." harf uzunluğunda olmalıdır ("..string.len(self.payload.name or "").." / "..maxLength..")", -1)
|
||
|
||
nameGenderPanel.OnTextChanged = function(this)
|
||
self.payload:Set("name", this:GetValue())
|
||
self:CheckIfFinished()
|
||
|
||
namewarning:SetText("Adınız minimum "..minLength.." harf uzunluğunda olmalıdır ("..string.len(this:GetValue() or "").." / "..maxLength..")")
|
||
namewarning:SizeToContents()
|
||
end
|
||
|
||
if self.faction:GetNoGenetics(LocalPlayer()) != true then
|
||
-- Genetics
|
||
self:CreateRightMenuTextPanel("genetik açıklama", 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("yaş", ageComboBox, 148, "age", {"genç (0 - 50)", "olgun genç (50 - 250)", "yetişkin (250 - 1000)", "bilge (1000 - 2000)", "yaşlı (2000 - 10000)"})
|
||
else
|
||
self:CreateSelectionMenu("yaş", ageComboBox, 100, "age", {"genç", "yetişkin", "orta-yaşlı", "yaşlı"})
|
||
end
|
||
|
||
local heightComboBox = comboBoxPanel:Add("DButton")
|
||
|
||
if self.faction.name == "Civil Protection" then
|
||
self:CreateSelectionMenu("boy", heightComboBox, 90, "height", {"5'5\"", "5'6\"", "5'8\"", "5'10\"", "6'0\"", "6'2\""})
|
||
elseif self.faction.name == "Vortigaunt" then
|
||
self:CreateSelectionMenu("boy", heightComboBox, 148, "height", {"6'4\"", "6'5\"", "6'6\"", "6'7\"", "6'8\"", "6'9\"", "6'10\"", "6'11\""})
|
||
else
|
||
self:CreateSelectionMenu("boy", heightComboBox, 90, "height", {"4'10\"", "5'0\"", "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("göz rengi", eyeColorBox, 146, "eye color", {"red", "yellow", "orange"})
|
||
else
|
||
self:CreateSelectionMenu("göz rengi", eyeColorBox, 110, "eye color", {"blue", "green", "brown", "hazel", "amber", "gray"})
|
||
end
|
||
|
||
self:CreateRightMenuYellowTextPanel("Genetik açıklamanız kalıcıdır.", 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, "yok")
|
||
|
||
self:CreateRightMenuTextPanel("ikinci dil", 10)
|
||
|
||
local languageBoxPanel = self.rightCreation:Add("Panel")
|
||
languageBoxPanel:Dock(TOP)
|
||
languageBoxPanel:SetTall(SScaleMin(36 / 3))
|
||
|
||
local languageComboBox = languageBoxPanel:Add("DButton")
|
||
self:CreateSelectionMenu("dil", languageComboBox, 110, "language", languages)
|
||
end
|
||
|
||
-- Description
|
||
self:CreateRightMenuTextPanel("fiziksel açıklama", 20)
|
||
local charDescPanel = self.rightCreation:Add("DTextEntry")
|
||
self:CreateRightMenuTextEntry(charDescPanel, "Karakterinizin fiziksel görünüşünü açıklayın...", 130, true, 1000, "desc")
|
||
|
||
local minDescLength = ix.config.Get("minDescriptionLength", 16)
|
||
local maxDescLength = ix.config.Get("maxDescriptionLength", 512)
|
||
local descLength = self:CreateRightMenuYellowTextPanel("Açıklamanız minimum "..minDescLength.." harf uzunluğunda olmalıdır ("..string.len(self.payload.description or "").." / "..maxDescLength..")", -1)
|
||
|
||
charDescPanel.OnTextChanged = function(this)
|
||
self.payload:Set("description", this:GetValue())
|
||
self:CheckIfFinished()
|
||
|
||
descLength:SetText("Açıklamanız minimum "..minDescLength.." harf uzunluğunda olmalıdır ("..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("HAYIR")
|
||
else
|
||
glassesButton:SetText("EVET")
|
||
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, "EVET", false)
|
||
elseif self.payload.data.glasses == false and i == 1 then
|
||
self:SetButtonSelected(glassesButton, "HAYIR", 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("NO BEARD")
|
||
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, "görünüm", "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("model seçimi", 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("Modeliniz kalıcıdır, dikkatli seçin.", 10)
|
||
|
||
if faction:GetNoAppearances(LocalPlayer()) != true then
|
||
self:CreateRightMenuTextPanel((faction.index == FACTION_VORT and "cilt rengi/kırışıklıklar" or "yüz özellikleri"), 10)
|
||
|
||
self.skinButtonPanel = self.rightCreation:Add("Panel")
|
||
self:CreateButtonPanel(self.skinButtonPanel)
|
||
|
||
if faction.index != FACTION_VORT then
|
||
self:CreateRightMenuTextPanel("gözlüğe ihtiyaç duyuyor musunuz?", 20)
|
||
|
||
self.glassesButtonPanel = self.rightCreation:Add("Panel")
|
||
self:CreateButtonPanel(self.glassesButtonPanel)
|
||
|
||
self:CreateRightMenuYellowTextPanel("Etkinleştirildiği taktirdee ekranınız gözlüğünüz olmadan bulanık olacaktır", 10)
|
||
end
|
||
|
||
|
||
self:RefreshSkins()
|
||
end
|
||
|
||
if !faction.ReadOptionDisabled then
|
||
self:CreateRightMenuTextPanel("Okuma biliyor musun?", 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("HAYIR")
|
||
else
|
||
canreadButton:SetText("EVET")
|
||
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, "EVET", false)
|
||
elseif self.payload.data.canread == false and i == 1 then
|
||
self:SetButtonSelected(canreadButton, "HAYIR", 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("Eğer bilmiyorsan yazılar karmaşık görünecek ancak birnevi okunabilir olacaklar.", 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, "saç", "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("Grubunuz saçı desteklemiyor!", 60)
|
||
return
|
||
end
|
||
|
||
self:CreateRightMenuTextPanel("saç seçimi", 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("renk seç", 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, "kıyafet", "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("ceket seçimi", 60)
|
||
|
||
local jacketButtonPanel = self.rightCreation:Add("Panel")
|
||
self:CreateButtonPanel(jacketButtonPanel)
|
||
self:CreateBodyGroupButtons(jacketButtonPanel, "torso")
|
||
|
||
self:CreateRightMenuTextPanel("pantolon seçimi", 30)
|
||
|
||
local trouserButtonPanel = self.rightCreation:Add("Panel")
|
||
self:CreateButtonPanel(trouserButtonPanel)
|
||
self:CreateBodyGroupButtons(trouserButtonPanel, "legs")
|
||
|
||
self:CreateRightMenuTextPanel("ayakkabı seçimi", 30)
|
||
|
||
local shoesButtonPanel = self.rightCreation:Add("Panel")
|
||
self:CreateButtonPanel(shoesButtonPanel)
|
||
self:CreateBodyGroupButtons(shoesButtonPanel, "shoes")
|
||
|
||
self:CreateRightMenuYellowTextPanel("Kıyafetler dükkanlardan satın alınabilir", 10)
|
||
else
|
||
self:CreateRightMenuTextPanel("Görünümler", 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("Grubunuz için kıyafet seçimi mevcut değildir")
|
||
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, "Bu hikaye CID olmadan başlar.") 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(" puan kaldı"))
|
||
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"] == "YELLOW" then
|
||
activeEyeColor = vortEyeYellowSkins
|
||
end
|
||
|
||
if self.payload.data["eye color"] == "ORANGE" then
|
||
activeEyeColor = vortEyeOrangeSkins
|
||
end
|
||
|
||
return activeEyeColor
|
||
end
|
||
|
||
local eyeColorBrownSkins = { 0, 1, 2, 3, 4 }
|
||
local eyeColorBlueSkins = { 5, 6, 7, 8, 9 }
|
||
local eyeColorGreenSkins = { 10, 11, 12, 13, 14 }
|
||
|
||
if (string.match(entityModel, "/male02")) then
|
||
eyeColorBrownSkins = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }
|
||
eyeColorBlueSkins = { 9, 10, 11, 12, 13, 14, 15, 16, 17 }
|
||
eyeColorGreenSkins = { 18, 19, 20, 21, 22, 23, 24, 25, 26 }
|
||
end
|
||
|
||
if (string.match(entityModel, "/male06")) then
|
||
eyeColorBrownSkins = { 0, 1, 2, 3, 4, 5 }
|
||
eyeColorBlueSkins = { 6, 7, 8, 9, 10, 11 }
|
||
eyeColorGreenSkins = { 12, 13, 14, 15, 16, 17 }
|
||
end
|
||
|
||
if (string.match(entityModel, "/male07")) then
|
||
eyeColorBrownSkins = { 0, 1, 2, 3, 4, 5, 6 }
|
||
eyeColorBlueSkins = { 7, 8, 9, 10, 11, 12, 13 }
|
||
eyeColorGreenSkins = { 14, 15, 16, 17, 18, 19, 20 }
|
||
end
|
||
|
||
if (string.match(entityModel, "/male10")) then
|
||
eyeColorBrownSkins = { 0 }
|
||
eyeColorBlueSkins = { 1 }
|
||
eyeColorGreenSkins = { 2 }
|
||
end
|
||
|
||
if (string.match(entityModel, "/female_03")) then
|
||
eyeColorBrownSkins = { 0, 1, 2, 3 }
|
||
eyeColorBlueSkins = { 4, 5, 6, 7 }
|
||
eyeColorGreenSkins = { 8, 9, 10, 11 }
|
||
end
|
||
|
||
local activeEyeColor = eyeColorBrownSkins
|
||
|
||
if self.payload.data["eye color"] == "BLUE" or self.payload.data["eye color"] == "GRAY" then
|
||
activeEyeColor = eyeColorBlueSkins
|
||
end
|
||
|
||
if self.payload.data["eye color"] == "GREEN" then
|
||
activeEyeColor = eyeColorGreenSkins
|
||
end
|
||
|
||
if self.payload.data["eye color"] == "HAZEL" or self.payload.data["eye color"] == "BROWN"
|
||
or self.payload.data["eye color"] == "AMBER" 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") |