77 | function PlayerStyle:loadXML(player, playerRootNode, xmlFile, baseKey) |
78 | local i = 0 |
79 | |
80 | self.player = player |
81 | -- bodies |
82 | i = 0 |
83 | while true do |
84 | local headKey = string.format("%s.playerStyle.bodies.variant(%d)#headNode", baseKey, i) |
85 | local armsKey = string.format("%s.playerStyle.bodies.variant(%d)#armNode", baseKey, i) |
86 | if not hasXMLProperty(xmlFile, headKey) or not hasXMLProperty(xmlFile, armsKey) then |
87 | break |
88 | end |
89 | local headNode = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, headKey)) |
90 | local armsNode = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, armsKey)) |
91 | table.insert(self.bodies, {headNode=headNode, armsNode=armsNode}) |
92 | i = i + 1 |
93 | end |
94 | -- hats |
95 | self.playerHatNode = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, string.format("%s.playerStyle.hats#rootNode", baseKey))) |
96 | self.hatReferenceFilename = getXMLString(xmlFile, string.format("%s.playerStyle.hats#filename", baseKey)) |
97 | -- accessories |
98 | self.playerAccessoryNode = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, string.format("%s.playerStyle.hats#rootNode", baseKey))) |
99 | self.accessoryReferenceFilename = getXMLString(xmlFile, string.format("%s.playerStyle.hats#filename", baseKey)) |
100 | -- hairs |
101 | self.hairs.hatStyleNode = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, string.format("%s.playerStyle.hairStyles#hatHairNode", baseKey))) |
102 | i = 0 |
103 | while true do |
104 | local hairStyleKey = string.format("%s.playerStyle.hairStyles.variant(%d)", baseKey, i) |
105 | if not hasXMLProperty(xmlFile, hairStyleKey) then |
106 | break |
107 | end |
108 | local node = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, hairStyleKey.."#node")) |
109 | local name = Utils.getNoNil(getXMLString(xmlFile, hairStyleKey.."#name"), "") |
110 | local isHatHair = Utils.getNoNil(getXMLBool(xmlFile, hairStyleKey.."#isHatHair"), false) |
111 | |
112 | if isHatHair and self.hairs.hatIndex == 0 then |
113 | self.hairs.hatIndex = i + 1 |
114 | end |
115 | |
116 | table.insert(self.hairs.styles, {node=node, name=name}) |
117 | i = i + 1 |
118 | end |
119 | -- jackets |
120 | i = 0 |
121 | while true do |
122 | local jacketKey = string.format("%s.playerStyle.jackets.variant(%d)", baseKey, i) |
123 | if not hasXMLProperty(xmlFile, jacketKey) then |
124 | break |
125 | end |
126 | local node = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, jacketKey.."#node")) |
127 | local name = getXMLString(xmlFile, jacketKey.."#name") |
128 | table.insert(self.jackets, {node=node, name=name}) |
129 | i = i + 1 |
130 | end |
131 | -- chainsaw protection |
132 | self.protection.helmetNode = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, string.format("%s.playerStyle.helmet#node", baseKey))) |
133 | self.protection.glovesNode = I3DUtil.indexToObject(playerRootNode, getXMLString(xmlFile, string.format("%s.playerStyle.gloves#node", baseKey))) |
134 | |
135 | -- default |
136 | if self.useDefault then |
137 | local defaultHatKey = string.format("%s.playerStyle#defaultHat", baseKey) |
138 | if hasXMLProperty(xmlFile, defaultHatKey) then |
139 | self.selectedHatIndex = getXMLInt(xmlFile, defaultHatKey) |
140 | end |
141 | local defaultAccessoryKey = string.format("%s.playerStyle#defaultAccessory", baseKey) |
142 | if hasXMLProperty(xmlFile, defaultAccessoryKey) then |
143 | self.selectedAccessoryIndex = getXMLInt(xmlFile, defaultAccessoryKey) |
144 | end |
145 | local defaultHairstyleKey = string.format("%s.playerStyle#defaultHaistyle", baseKey) |
146 | if hasXMLProperty(xmlFile, defaultHairstyleKey) then |
147 | self.selectedHairIndex = getXMLInt(xmlFile, defaultHairstyleKey) |
148 | end |
149 | local defaultBodyKey = string.format("%s.playerStyle#defaultBody", baseKey) |
150 | if hasXMLProperty(xmlFile, defaultBodyKey) then |
151 | self.selectedBodyIndex = getXMLInt(xmlFile, defaultBodyKey) |
152 | end |
153 | end |
154 | end |
16 | function PlayerStyle:new(customMt) |
17 | local self = {} |
18 | setmetatable(self, customMt or PlayerStyle_mt) |
19 | |
20 | self.player = nil |
21 | self.selectedModelIndex = 1 |
22 | self.selectedColorIndex = 0 |
23 | self.selectedBodyIndex = 0 |
24 | self.selectedHatIndex = 0 |
25 | self.selectedAccessoryIndex = 0 |
26 | self.selectedHairIndex = 0 |
27 | self.selectedJacketIndex = 0 |
28 | self.playerName = "player" |
29 | self.bodies = {} |
30 | self.playerHatNode = nil |
31 | self.playerAccessoryNode = nil |
32 | self.accessoryNode = nil |
33 | self.hatNode = nil |
34 | self.hatReferenceFilename = "" |
35 | self.accessoryReferenceFilename = "" |
36 | self.accessories = {} |
37 | self.hairs = {} |
38 | self.hairs.hatStyleNode = nil |
39 | self.hairs.styles = {} |
40 | self.jackets = {} |
41 | self.protection = {} |
42 | self.protection.helmetNode = nil |
43 | self.protection.glovesNode = nil |
44 | self.protection.isVisible = false |
45 | self.useDefault = false |
46 | |
47 | return self |
48 | end |
363 | function PlayerStyle:setAccessory(accessoryIndex) |
364 | local result = false |
365 | |
366 | if self.player ~= nil and self.playerAccessoryNode ~= nil then |
367 | if accessoryIndex == 0 and self.selectedAccessoryIndex > 0 then |
368 | result = self:removeHat() |
369 | self:setHair(self.selectedHairIndex) |
370 | elseif accessoryIndex ~= self.selectedAccessoryIndex or self.accessoryNode == nil then |
371 | self:removeAccessory() |
372 | local xmlFilename = Utils.getFilename(self.accessoryReferenceFilename) |
373 | |
374 | if xmlFilename ~= nil and xmlFilename ~= "" then |
375 | local xmlFile = loadXMLFile("accessoryXML", xmlFilename) |
376 | |
377 | if xmlFile ~= nil and xmlFile ~= 0 then |
378 | local accessoryKey = string.format("playerClothing.accessories.accessory(%d)#filename", accessoryIndex - 1) |
379 | if hasXMLProperty(xmlFile, accessoryKey) then |
380 | local i3dFilename = getXMLString(xmlFile, accessoryKey) |
381 | self.accessoryNode = loadI3DFile(i3dFilename, false, false, false) |
382 | |
383 | if self.accessoryNode ~= nil then |
384 | link(self.playerAccessoryNode, self.accessoryNode) |
385 | self.selectedAccessoryIndex = accessoryIndex |
386 | result = true |
387 | end |
388 | end |
389 | delete(xmlFile) |
390 | end |
391 | end |
392 | end |
393 | else |
394 | g_logManager:devError("-- [PlayerStyle:setAccessory] Player not set. Missing call to PlayerStyle:loadXML().") |
395 | end |
396 | return result |
397 | end |
271 | function PlayerStyle:setHair(hairIndex, isHatHair) |
272 | local result = false |
273 | |
274 | if self.player ~= nil then |
275 | if isHatHair ~= nil and isHatHair then |
276 | if self.selectedHairIndex > 0 then |
277 | local currentHairStyleNode = self.hairs.styles[self.selectedHairIndex].node |
278 | setVisibility(currentHairStyleNode, false) |
279 | setVisibility(self.hairs.hatStyleNode, true) |
280 | end |
281 | result = true |
282 | else |
283 | for key, hairStyle in ipairs(self.hairs.styles) do |
284 | if key == hairIndex then |
285 | if self.selectedHatIndex == 0 then |
286 | setVisibility(hairStyle.node, true) |
287 | end |
288 | self.selectedHairIndex = key |
289 | result = true |
290 | else |
291 | setVisibility(hairStyle.node, false) |
292 | end |
293 | end |
294 | end |
295 | else |
296 | g_logManager:devError("-- [PlayerStyle:setHair] Player not set. Missing call to PlayerStyle:loadXML().") |
297 | end |
298 | return result |
299 | end |
303 | function PlayerStyle:setHat(hatIndex) |
304 | local result = false |
305 | |
306 | if self.player ~= nil and self.playerHatNode ~= nil then |
307 | if hatIndex == 0 and self.selectedHatIndex > 0 then |
308 | result = self:removeHat() |
309 | self:setHair(self.selectedHairIndex) |
310 | elseif hatIndex ~= self.selectedHatIndex or self.hatNode == nil then |
311 | self:removeHat() |
312 | local xmlFilename = Utils.getFilename(self.hatReferenceFilename) |
313 | |
314 | if xmlFilename ~= nil and xmlFilename ~= "" then |
315 | local xmlFile = loadXMLFile("hatXML", xmlFilename) |
316 | |
317 | if xmlFile ~= nil and xmlFile ~= 0 then |
318 | local hatKey = string.format("playerClothing.hats.hat(%d)#filename", hatIndex - 1) |
319 | if hasXMLProperty(xmlFile, hatKey) then |
320 | local i3dFilename = getXMLString(xmlFile, hatKey) |
321 | self.hatNode = loadI3DFile(i3dFilename, false, false, false) |
322 | |
323 | if self.hatNode ~= nil then |
324 | self:setHair(0, true) |
325 | link(self.playerHatNode, self.hatNode) |
326 | self.selectedHatIndex = hatIndex |
327 | result = true |
328 | end |
329 | end |
330 | delete(xmlFile) |
331 | end |
332 | end |
333 | end |
334 | else |
335 | g_logManager:devError("-- [PlayerStyle:setHat] Player not set. Missing call to PlayerStyle:loadXML().") |
336 | end |
337 | return result |
338 | end |
454 | function PlayerStyle:setVisibility(state) |
455 | if self.player ~= nil then |
456 | if self.selectedBodyIndex > 0 then |
457 | local body = self.bodies[self.selectedBodyIndex] |
458 | setVisibility(body.headNode, state) |
459 | setVisibility(body.armsNode, state) |
460 | end |
461 | if self.hatNode ~= nil then |
462 | setVisibility(self.hatNode, state) |
463 | if self.selectedHairIndex > 0 then |
464 | setVisibility(self.hairs.hatStyleNode, state) |
465 | end |
466 | else |
467 | if self.selectedHairIndex > 0 then |
468 | local currentHairStyleNode = self.hairs.styles[self.selectedHairIndex].node |
469 | setVisibility(currentHairStyleNode, state) |
470 | end |
471 | end |
472 | if self.accessoryNode ~= nil then |
473 | setVisibility(self.accessoryNode, state) |
474 | end |
475 | if self.selectedJacketIndex > 0 then |
476 | local jacket = self.jackets[self.selectedJacketIndex] |
477 | setVisibility(jacket.node, state) |
478 | end |
479 | else |
480 | g_logManager:devError("-- [PlayerStyle:setVisibility] Player not set. Missing call to PlayerStyle:loadXML().") |
481 | end |
482 | end |