FrameworkZ 4.4.2
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
CreateCharacterAppearance.lua
Go to the documentation of this file.
3require "ISUI/ISPanel"
5PFW_CreateCharacterAppearance = ISPanel:derive("PFW_CreateCharacterAppearance")
7local yOffset = 0
9function PFW_CreateCharacterAppearance:initialise()
10 ISPanel.initialise(self)
11
12 local isFemale = (self.gender == "Female" and true) or (self.gender == "Male" and false)
13 self.survivor = SurvivorFactory:CreateSurvivor(SurvivorType.Neutral, isFemale)
15 self.survivor:getHumanVisual():setSkinTextureIndex(self.skinColor)
17 local immutableColor = ImmutableColor.new(self.hairColor.r, self.hairColor.g, self.hairColor.b, 1)
19 self.survivor:getHumanVisual():setHairColor(immutableColor)
20 self.survivor:getHumanVisual():setBeardColor(immutableColor)
21 self.survivor:getHumanVisual():setNaturalHairColor(immutableColor)
22 self.survivor:getHumanVisual():setNaturalBeardColor(immutableColor)
23
25
26 local title = "Appearance"
27 local subtitle = "Customize your character's appearance."
28 local factionWidth = 500
29 local factionHeight = 300
30 local dropdownWidth = self.width * 0.5
31 local middleX = self.width / 2
32 local quarterX = self.width / 4
33 self.factionsClothing = FrameworkZ.Factions:GetFactionByID(self.faction).clothing
34 self.initialFaction = nil
35 local entryWidth = 200
36 local xPadding = self.width * 0.1
37 local entryX = xPadding
38 local labelX = xPadding - 5
40 ISPanel.initialise(self)
42 yOffset = self.uiHelper.GetHeight(UIFont.Title, title)
44 self.title = ISLabel:new(self.uiHelper.GetMiddle(self.width, UIFont.Title, title), yOffset, 25, title, 1, 1, 1, 1, UIFont.Title, true)
45 self.title:initialise()
46 self:addChild(self.title)
48 yOffset = yOffset + self.uiHelper.GetHeight(UIFont.Large, subtitle)
49
50 self.subtitle = ISLabel:new(self.uiHelper.GetMiddle(self.width, UIFont.Large, subtitle), yOffset, 25, subtitle, 1, 1, 1, 1, UIFont.Large, true)
51 self.subtitle:initialise()
52 self:addChild(self.subtitle)
53
54 yOffset = yOffset + 45
55
58 self.characterPreview:setCharacter(getPlayer())
60 self:addChild(self.characterPreview)
62 self.hairLabel = ISLabel:new(entryX - 5, yOffset, 25, "Hair:", 1, 1, 1, 1, UIFont.Large, false)
63 self.hairLabel:initialise()
64 self:addChild(self.hairLabel)
66 local hairStyles = getAllHairStyles(isFemale)
68 self.hairDropdown = ISComboBox:new(entryX, yOffset, entryWidth, 25, self, self.onHairChanged)
70 for i = 1, hairStyles:size() do
71 local styleId = hairStyles:get(i - 1)
72 local hairStyle = isFemale and getHairStylesInstance():FindFemaleStyle(styleId) or getHairStylesInstance():FindMaleStyle(styleId)
73 local label = styleId
74
75 if label == "" then
76 label = getText("IGUI_Hair_Bald")
77 else
78 label = getText("IGUI_Hair_" .. label)
79 end
80
81 if not hairStyle:isNoChoose() then
82 self.hairDropdown:addOptionWithData(label, hairStyles:get(i - 1))
83 end
84 end
85
86 self.hairDropdown:initialise()
87 self:onHairChanged(self.hairDropdown)
88 self:addChild(self.hairDropdown)
89
90 yOffset = yOffset + 30
91
92 self.beardLabel = ISLabel:new(entryX - 5, yOffset, 25, "Beard:", 1, 1, 1, 1, UIFont.Large, false)
93 self.beardLabel:initialise()
94 self:addChild(self.beardLabel)
95
96 self.beardDropdown = ISComboBox:new(entryX, yOffset, entryWidth, 25, self, self.onBeardChanged)
97
98 if not isFemale then
99 local beardStyles = getAllBeardStyles()
100
101 for i = 1, beardStyles:size() do
102 local label = beardStyles:get(i - 1)
103
104 if label == "" then
105 label = getText("IGUI_Beard_None")
106 else
107 label = getText("IGUI_Beard_" .. label);
108 end
109
110 self.beardDropdown:addOptionWithData(label, beardStyles:get(i - 1))
111 end
112 end
113
114 if isFemale then
115 self.beardDropdown:addOptionWithData("N/A", nil)
116 end
117
118 self.beardDropdown:initialise()
119 self:onBeardChanged(self.beardDropdown)
120 self:addChild(self.beardDropdown)
121
122 yOffset = yOffset + 30
123
124 if self.factionsClothing then
125 self.headLabel, self.headDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Head:", "Hat", self.factionsClothing.head)
126 self.faceLabel, self.faceDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Face:", "Mask", self.factionsClothing.face)
127 self.earsLabel, self.earsDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Ears:", "Ears", self.factionsClothing.ears)
128 self.backpackLabel, self.backpackDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Backpack:", "Back", self.factionsClothing.backpack)
129 self.glovesLabel, self.glovesDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Gloves:", "Hands", self.factionsClothing.gloves)
130 self.undershirtLabel, self.undershirtDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Undershirt:", "Tshirt", self.factionsClothing.undershirt)
131 self.overshirtLabel, self.overshirtDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Overshirt:", "Shirt", self.factionsClothing.overshirt)
132 self.vestLabel, self.vestDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Vest:", "TorsoExtraVest", self.factionsClothing.vest)
133 self.beltLabel, self.beltDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Belt:", "Belt", self.factionsClothing.belt)
134 self.pantsLabel, self.pantsDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Pants:", "Pants", self.factionsClothing.pants)
135 self.socksLabel, self.socksDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Socks:", "Socks", self.factionsClothing.socks)
136 self.shoesLabel, self.shoesDropdown = self:addClothingOption(entryX, yOffset, 25, entryWidth, "Shoes:", "Shoes", self.factionsClothing.shoes)
137 end
138end
139
140function PFW_CreateCharacterAppearance:addClothingOption(x, y, height, entryWidth, labelText, clothingLocation, clothingTable)
141 if not clothingTable then return nil, nil end
142
143 local label = ISLabel:new(x - 5, y, height, labelText, 1, 1, 1, 1, UIFont.Large, false)
144 label:initialise()
145 self:addChild(label)
146
147 local dropdown = ISComboBox:new(x, y, entryWidth, height,self, self.onClothingChanged)
148
149 if clothingTable then
150 for k, v in pairs(clothingTable) do
151 dropdown:addOptionWithData(v, {location = clothingLocation, itemID = k})
152 end
153 end
154
155 dropdown:addOptionWithData("None", {location = clothingLocation, itemID = nil})
156 dropdown:initialise()
157 self:onClothingChanged(dropdown)
158 self:addChild(dropdown)
159
160 if not clothingTable then
161 label:setVisible(false)
162 dropdown:setVisible(false)
163
164 return label, dropdown
165 end
166 yOffset = yOffset + 30
167
168 return label, dropdown
169end
170
171function PFW_CreateCharacterAppearance:onHairChanged(dropdown)
172 local hair = dropdown:getOptionData(dropdown.selected)
173
174 self.hairType = dropdown.selected - 1
175 self.survivor:getHumanVisual():setHairModel(hair)
176 self.characterPreview:setSurvivorDesc(self.survivor)
177end
178
179function PFW_CreateCharacterAppearance:onBeardChanged(dropdown)
180 local beard = dropdown:getOptionData(dropdown.selected)
181
182 self.beardType = dropdown.selected - 1
183 self.survivor:getHumanVisual():setBeardModel(beard)
184 self.characterPreview:setSurvivorDesc(self.survivor)
185end
186
187function PFW_CreateCharacterAppearance:onClothingChanged(dropdown)
188 if not dropdown then return end
189
190 local dropdownData = dropdown:getOptionData(dropdown.selected)
191 local itemID = dropdownData.itemID
192 local location = dropdownData.location
193 local item = InventoryItemFactory.CreateItem(itemID)
194
195 self.survivor:setWornItem(location, nil)
196
197 if item then
198 self.survivor:setWornItem(location, item)
199 end
200
201 self.characterPreview:setSurvivorDesc(self.survivor)
202end
203
204function PFW_CreateCharacterAppearance:resetGender(newGender)
205 if self.survivor and self.gender ~= newGender then
206 self.gender = newGender
207
208 local isFemale = (self.gender == "Female" and true) or (self.gender == "Male" and false)
209 self.survivor = SurvivorFactory:CreateSurvivor(SurvivorType.Neutral, isFemale)
210 self.survivor:setFemale(isFemale)
211 self:onClothingChanged(self.headDropdown)
212 self:onClothingChanged(self.undershirtDropdown)
213 self:onClothingChanged(self.overshirtDropdown)
214 self:onClothingChanged(self.pantsDropdown)
215 self:onClothingChanged(self.socksDropdown)
216 self:onClothingChanged(self.shoesDropdown)
217 self.characterPreview:setSurvivorDesc(self.survivor)
218
219 self:onHairChanged(self.hairDropdown)
220
221 self.wasGenderUpdated = true
222 end
223end
224
225function PFW_CreateCharacterAppearance:resetHairColor()
226 if self.survivor then
227 local immutableColor = ImmutableColor.new(self.hairColor.r, self.hairColor.g, self.hairColor.b, 1)
228
229 self.survivor:getHumanVisual():setHairColor(immutableColor)
230 self.survivor:getHumanVisual():setBeardColor(immutableColor)
231 self.survivor:getHumanVisual():setNaturalHairColor(immutableColor)
232 self.survivor:getHumanVisual():setNaturalBeardColor(immutableColor)
233
234 self.characterPreview:setSurvivorDesc(self.survivor)
235 end
236end
237
238function PFW_CreateCharacterAppearance:resetHairStyles()
239 if self.survivor then
240 local hairStyles = getAllHairStyles(self.survivor:isFemale())
241
242 self.hairDropdown:clear()
243
244 for i = 1, hairStyles:size() do
245 local styleId = hairStyles:get(i - 1)
246 local hairStyle = self.survivor:isFemale() and getHairStylesInstance():FindFemaleStyle(styleId) or getHairStylesInstance():FindMaleStyle(styleId)
247 local label = styleId
248
249 if label == "" then
250 label = getText("IGUI_Hair_Bald")
251 else
252 label = getText("IGUI_Hair_" .. label)
253 end
254
255 if not hairStyle:isNoChoose() then
256 self.hairDropdown:addOptionWithData(label, hairStyles:get(i - 1))
257 end
258 end
259
260 if self.wasGenderUpdated then
261 self.hairDropdown:select("Bald")
262 end
263
264 self:onHairChanged(self.hairDropdown)
265 end
266end
267
268function PFW_CreateCharacterAppearance:resetBeardStyles()
269 if self.survivor then
270 local isFemale = (self.gender == "Female" and true) or (self.gender == "Male" and false)
271
272 if not isFemale then
273 local beardStyles = getAllBeardStyles()
274
275 self.beardDropdown:clear()
276
277 for i = 1, beardStyles:size() do
278 local label = beardStyles:get(i - 1)
279
280 if label == "" then
281 label = getText("IGUI_Beard_None")
282 else
283 label = getText("IGUI_Beard_" .. label)
284 end
285
286 self.beardDropdown:addOptionWithData(label, beardStyles:get(i - 1))
287 end
288
289 self:onBeardChanged(self.beardDropdown)
290 else
291 self.beardDropdown:clear()
292 self.beardDropdown:addOptionWithData("N/A", nil)
294
295 self:onBeardChanged(self.beardDropdown)
296 end
297 end
298end
299
300function PFW_CreateCharacterAppearance:resetSkinColor()
301 if self.survivor then
302 self.survivor:getHumanVisual():setSkinTextureIndex(self.skinColor)
303 self.characterPreview:setSurvivorDesc(self.survivor)
304 end
305end
306
307function PFW_CreateCharacterAppearance:render()
308 ISPanel.render(self)
309end
310
311function PFW_CreateCharacterAppearance:update()
312 ISPanel.update(self)
313end
314
315function PFW_CreateCharacterAppearance:new(parameters)
316 local o = {}
317
318 o = ISPanel:new(parameters.x, parameters.y, parameters.width, parameters.height)
319 setmetatable(o, self)
320 self.__index = self
321 o.backgroundColor = {r=0, g=0, b=0, a=0}
322 o.borderColor = {r=0, g=0, b=0, a=0}
323 o.moveWithMouse = false
324 o.playerObject = parameters.playerObject
325 o.faction = parameters.faction
326 o.gender = parameters.gender
327 o.skinColor = parameters.skinColor
328 o.hairColor = parameters.hairColor
330
331 return o
332end
333
void Factions()
void if select("#",...)()
void local y()
void local isFemale()
void self characterPreview()
void self survivor()
void self uiHelper()
void local x()
void hairColor()
void skinColor()
void self self faceDropdown()
void self self vestDropdown()
void self self socksDropdown()
void self self pantsDropdown()
void self self overshirtDropdown()
void self beltLabel
void self shoesLabel
void local beardStyles()
void self self backpackDropdown()
void self socksLabel
void self beardDropdown()
void self vestLabel
void self self earsDropdown()
void self earsLabel
void self backpackLabel
void self self shoesDropdown()
void self beardLabel()
void self overshirtLabel
void PFW_CreateCharacterAppearance()
Definition MainMenu.lua:89
void self pantsLabel
void self self beltDropdown()
void self headLabel
void self self undershirtDropdown()
void self self headDropdown()
void self faceLabel
void self glovesLabel
void self undershirtLabel
void local yOffset()
void self self glovesDropdown()
void for i()
void local label()
void FrameworkZ()
void self subtitle()
void if self initialFaction and v()
void self faction()
void self title()
void local height()
void local width
void itemID()
void self self
Definition MainMenu.lua:85
void self self nil
Definition MainMenu.lua:91
void local middleX()
void processingNotification backgroundColor a()
void local getPlayer()
void local character()
void local item()
FrameworkZ global table.
void onClothingChanged(dropdown)
void addClothingOption(x, y, height, entryWidth, labelText, clothingLocation, clothingTable)