SHOW:
|
|
- or go back to the newest paste.
1 | diff --git a/cfiles/game/config/main/L2jOrion.ini b/cfiles/game/config/main/L2jOrion.ini | |
2 | index bf1867e..eddb8e7 100644 | |
3 | --- a/cfiles/game/config/main/L2jOrion.ini | |
4 | +++ b/cfiles/game/config/main/L2jOrion.ini | |
5 | @@ -333,4 +333,7 @@ | |
6 | NewPlayerEffect = False | |
7 | ||
8 | # It shows Castle's Lord clan crest in town nearby npc name | |
9 | -ShowNpcCrest = False | |
10 | \ No newline at end of file | |
11 | +ShowNpcCrest = False | |
12 | + | |
13 | +TextureSkinPackageName = MAYKE_MENDES_SKIN | |
14 | +TextureSkinSuffixName = _f | |
15 | \ No newline at end of file | |
16 | diff --git a/data/html/SkinManager/Main.htm b/data/html/SkinManager/Main.htm | |
17 | new file mode 100644 | |
18 | index 0000000..c863c08 | |
19 | --- /dev/null | |
20 | +++ b/data/html/SkinManager/Main.htm | |
21 | @@ -0,0 +1,31 @@ | |
22 | +<html> | |
23 | + <body> | |
24 | + <title>Skin Manager</title> | |
25 | + <br> | |
26 | + <center> | |
27 | + <center><img src="L2UI.SquareWhite" width=200 height=1></center> | |
28 | +<table bgcolor=3c3c3c width=204> | |
29 | +<tr> | |
30 | +<td><center><font color="FFFF00">Skin Test / Buy </font></center></td> | |
31 | +</tr> | |
32 | +</table></center> | |
33 | +<center><img src="L2UI.SquareWhite" width=200 height=1></center> | |
34 | +<br> | |
35 | + </center> | |
36 | + <table width=300> | |
37 | + %skins%<br><br> | |
38 | + </table> | |
39 | + <center> | |
40 | + | |
41 | + | |
42 | + <table width=270 align=center > | |
43 | + <tr> | |
44 | + | |
45 | + %pages% | |
46 | + | |
47 | + </tr> | |
48 | + </table> | |
49 | + </center> | |
50 | + | |
51 | + </body> | |
52 | +</html> | |
53 | \ No newline at end of file | |
54 | diff --git a/data/html/SkinManager/Skin.htm b/data/html/SkinManager/Skin.htm | |
55 | new file mode 100644 | |
56 | index 0000000..fb4d8cb | |
57 | --- /dev/null | |
58 | +++ b/data/html/SkinManager/Skin.htm | |
59 | @@ -0,0 +1,52 @@ | |
60 | +<html> | |
61 | + <body> | |
62 | + <title>Skin Manager</title> | |
63 | + <br><br> | |
64 | + <center> | |
65 | + <font color=LEVEL >SKIN DATA</font> | |
66 | + | |
67 | + </center> | |
68 | + <table width=310 bgcolor=000000 height=80> | |
69 | + <tr> | |
70 | + <td width=50> | |
71 | + | |
72 | + </td> | |
73 | + <td align=left> | |
74 | + | |
75 | + <font color=LEVEL>- Skin Name: </font> | |
76 | + <font color=ff0000> %skiname% </font><br1> | |
77 | + <font color=LEVEL>- Skin Price:</font> | |
78 | + <font color=ff0000> %skinprice% </font> | |
79 | + <font color=87ff26> %skinpriceid% </font> | |
80 | + | |
81 | + | |
82 | + </td> | |
83 | + | |
84 | + </tr> | |
85 | + | |
86 | + </table> | |
87 | + | |
88 | + <center><br><br><br> | |
89 | + <font color=LEVEL > FUNCTIONS</font> | |
90 | + | |
91 | + </center> | |
92 | + | |
93 | + <table width=301 bgcolor=0000 > | |
94 | + | |
95 | + | |
96 | + %showbutton% | |
97 | + | |
98 | + </table> | |
99 | + <center> | |
100 | + <table width=310 align=center> | |
101 | + <tr> | |
102 | + <td align=center><br><br> | |
103 | + <button value="Back" action="bypass -h skinPage 1" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal"> | |
104 | + </td> | |
105 | + | |
106 | + | |
107 | + </tr> | |
108 | + </table> | |
109 | + </center> | |
110 | + </body> | |
111 | +</html> | |
112 | \ No newline at end of file | |
113 | diff --git a/data/xml/Skins.xml b/data/xml/Skins.xml | |
114 | new file mode 100644 | |
115 | index 0000000..eaeaff8 | |
116 | --- /dev/null | |
117 | +++ b/data/xml/Skins.xml | |
118 | @@ -0,0 +1,68 @@ | |
119 | +<?xml version="1.0" encoding="utf-8"?> | |
120 | +<list> | |
121 | +<!-- Try Skins --> | |
122 | + | |
123 | + <skin id="1" name="Anakim Suit" utx_name="anakim" chest="10100" legs="0" gloves="0" feet="0" hair="10101" isVip="0" price_id="3470" price="100"> | |
124 | + | |
125 | + </skin> | |
126 | + | |
127 | + <skin id="2" name="White Knight" utx_name="rei2" chest="10129" legs="0" gloves="0" feet="0" hair="10130" isVip="0" price_id="3470" price="10"> | |
128 | + | |
129 | + </skin> | |
130 | + | |
131 | + <skin id="3" name="Archer Suit B" utx_name="archer2" chest="10105" legs="0" gloves="0" feet="0" hair="10106" isVip="0" price_id="3470" price="10"> | |
132 | + | |
133 | + </skin> | |
134 | + | |
135 | + <skin id="4" name="Beleth Suit" utx_name="beleth" chest="10124" legs="0" gloves="0" feet="0" hair="10125" isVip="0" price_id="3470" price="10"> | |
136 | + | |
137 | + </skin> | |
138 | + | |
139 | + <skin id="5" name="Cat Suit" utx_name="cat" chest="10144" legs="0" gloves="0" feet="0" hair="15017" isVip="0" price_id="3470" price="10"> | |
140 | + </skin> | |
141 | + | |
142 | + <skin id="6" name="CowBoy Suit" utx_name="cowboy" chest="10110" legs="0" gloves="0" feet="0" hair="0" isVip="0" price_id="3470" price="10"> | |
143 | + </skin> | |
144 | + | |
145 | + <skin id="7" name="Cyborg Suit" utx_name="cyborg" chest="10105" legs="0" gloves="0" feet="0" hair="10106" isVip="0" price_id="3470" price="10"> | |
146 | + </skin> | |
147 | + | |
148 | + <skin id="8" name="Dark Assassin Suit" utx_name="dark" chest="10122" legs="0" gloves="0" feet="0" hair="10123" isVip="0" price_id="3470" price="10"> | |
149 | + </skin> | |
150 | + | |
151 | + <skin id="9" name="Dragon Born Suit" utx_name="dragon" chest="10156" legs="0" gloves="0" feet="0" hair="15047" isVip="0" price_id="3470" price="10"> | |
152 | + </skin> | |
153 | + | |
154 | + <skin id="10" name="Dark Knight Suit" utx_name="knight" chest="10112" legs="0" gloves="0" feet="0" hair="10113" isVip="0" price_id="3470" price="10"> | |
155 | + </skin> | |
156 | + | |
157 | + <skin id="11" name="Light Assassin Suit" utx_name="light" chest="10120" legs="0" gloves="0" feet="0" hair="10121" isVip="0" price_id="3470" price="10"> | |
158 | + </skin> | |
159 | + | |
160 | + <skin id="12" name="Saxon Guard Suit" utx_name="valkyri" chest="10135" legs="0" gloves="0" feet="0" hair="0" isVip="0" price_id="3470" price="10"> | |
161 | + </skin> | |
162 | + | |
163 | + <skin id="13" name="Ninja Suit" utx_name="ninja" chest="10118" legs="0" gloves="0" feet="0" hair="0" isVip="0" price_id="3470" price="10"> | |
164 | + </skin> | |
165 | + | |
166 | + <skin id="14" name="Red Zaken Suit" utx_name="pirate" chest="10136" legs="0" gloves="0" feet="0" hair="10137" isVip="0" price_id="3470" price="10"> | |
167 | + </skin> | |
168 | + | |
169 | + <skin id="15" name="Blue Zaken Suit" utx_name="pirate_blue" chest="10136" legs="0" gloves="0" feet="0" hair="10137" isVip="0" price_id="3470" price="10"> | |
170 | + </skin> | |
171 | + | |
172 | + <skin id="16" name="King Setim Suit" utx_name="rei" chest="10127" legs="0" gloves="0" feet="0" hair="10128" isVip="0" price_id="3470" price="10"> | |
173 | + </skin> | |
174 | + | |
175 | + <skin id="17" name="King White Setim Suit" utx_name="rei2" chest="10133" legs="0" gloves="0" feet="0" hair="10134" isVip="0" price_id="3470" price="10"> | |
176 | + </skin> | |
177 | + | |
178 | + <skin id="18" name="Priest Suit" utx_name="saint" chest="10140" legs="0" gloves="0" feet="0" hair="10141" isVip="0" price_id="3470" price="10"> | |
179 | + </skin> | |
180 | + | |
181 | + <skin id="19" name="Black Samurai Suit" utx_name="samurai" chest="10142" legs="0" gloves="0" feet="0" hair="10143" isVip="0" price_id="3470" price="10"> | |
182 | + </skin> | |
183 | + | |
184 | + <!-- L2 Urban --> | |
185 | + | |
186 | +</list> | |
187 | \ No newline at end of file | |
188 | diff --git a/src/Base/SkinBeauty/Skin.java b/src/Base/SkinBeauty/Skin.java | |
189 | new file mode 100644 | |
190 | index 0000000..b69a76d | |
191 | --- /dev/null | |
192 | +++ b/src/Base/SkinBeauty/Skin.java | |
193 | @@ -0,0 +1,110 @@ | |
194 | +package Base.SkinBeauty; | |
195 | + | |
196 | +import l2jorion.game.datatables.sql.ItemTable; | |
197 | +import l2jorion.game.templates.L2Item; | |
198 | +import l2jorion.game.templates.StatsSet; | |
199 | + | |
200 | +public class Skin | |
201 | +{ | |
202 | + private int id; | |
203 | + | |
204 | + private StatsSet stats; | |
205 | + | |
206 | + private boolean released; | |
207 | + | |
208 | + public Skin(int id, StatsSet stats) | |
209 | + { | |
210 | + this.id = id; | |
211 | + this.stats = stats; | |
212 | + } | |
213 | + | |
214 | + public StatsSet getStats() | |
215 | + { | |
216 | + return this.stats; | |
217 | + } | |
218 | + | |
219 | + public void setStats(StatsSet stats) | |
220 | + { | |
221 | + this.stats = stats; | |
222 | + } | |
223 | + | |
224 | + public int getId() | |
225 | + { | |
226 | + return this.id; | |
227 | + } | |
228 | + | |
229 | + public void setId(int id) | |
230 | + { | |
231 | + this.id = id; | |
232 | + } | |
233 | + | |
234 | + public boolean isReleased() | |
235 | + { | |
236 | + return this.released; | |
237 | + } | |
238 | + | |
239 | + public void setReleased(boolean released) | |
240 | + { | |
241 | + this.released = released; | |
242 | + } | |
243 | + | |
244 | + public int getPrice() | |
245 | + { | |
246 | + return getStats().getInteger("price"); | |
247 | + } | |
248 | + | |
249 | + public int getPriceId() | |
250 | + { | |
251 | + return getStats().getInteger("price_id"); | |
252 | + } | |
253 | + | |
254 | + public String getName() | |
255 | + { | |
256 | + return getStats().getString("name"); | |
257 | + } | |
258 | + | |
259 | + public boolean isVip() | |
260 | + { | |
261 | + return (getStats().getInteger("isVip") == 1); | |
262 | + } | |
263 | + | |
264 | + public int getHair() | |
265 | + { | |
266 | + return getStats().getInteger("hair"); | |
267 | + } | |
268 | + | |
269 | + public int getChest() | |
270 | + { | |
271 | + return getStats().getInteger("chest"); | |
272 | + } | |
273 | + | |
274 | + public int getGloves() | |
275 | + { | |
276 | + return getStats().getInteger("gloves"); | |
277 | + } | |
278 | + | |
279 | + public int getLegs() | |
280 | + { | |
281 | + return getStats().getInteger("legs"); | |
282 | + } | |
283 | + | |
284 | + public int getFeet() | |
285 | + { | |
286 | + return getStats().getInteger("feet"); | |
287 | + } | |
288 | + | |
289 | + public String getUtxName() | |
290 | + { | |
291 | + return getStats().getString("utx_name"); | |
292 | + } | |
293 | + | |
294 | + public String getPriceItemName() | |
295 | + { | |
296 | + L2Item i = ItemTable.getInstance().getTemplate(getPriceId()); | |
297 | + if (i != null) | |
298 | + { | |
299 | + return i.getName(); | |
300 | + } | |
301 | + return "No Price"; | |
302 | + } | |
303 | +} | |
304 | diff --git a/src/Base/SkinBeauty/SkinData.java b/src/Base/SkinBeauty/SkinData.java | |
305 | new file mode 100644 | |
306 | index 0000000..2f0fa39 | |
307 | --- /dev/null | |
308 | +++ b/src/Base/SkinBeauty/SkinData.java | |
309 | @@ -0,0 +1,253 @@ | |
310 | +package Base.SkinBeauty; | |
311 | + | |
312 | +import java.io.File; | |
313 | +import java.util.ArrayList; | |
314 | +import java.util.HashMap; | |
315 | +import java.util.List; | |
316 | +import java.util.Map; | |
317 | + | |
318 | +import org.w3c.dom.Document; | |
319 | +import org.w3c.dom.NamedNodeMap; | |
320 | +import org.w3c.dom.Node; | |
321 | + | |
322 | +import Base.XML.XMLDocument; | |
323 | +import l2jorion.game.templates.StatsSet; | |
324 | + | |
325 | +public class SkinData extends XMLDocument | |
326 | +{ | |
327 | + public static Map<Skin, StatsSet> skinList = new HashMap<>(); | |
328 | + | |
329 | + public SkinData() | |
330 | + { | |
331 | + load(); | |
332 | + } | |
333 | + | |
334 | + public static SkinData getInstance() | |
335 | + { | |
336 | + return SingleTonHolder._instance; | |
337 | + } | |
338 | + | |
339 | + private static class SingleTonHolder | |
340 | + { | |
341 | + protected static final SkinData _instance = new SkinData(); | |
342 | + } | |
343 | + | |
344 | + @Override | |
345 | + protected void load() | |
346 | + { | |
347 | + loadDocument("./data/xml/Skins.xml"); | |
348 | + } | |
349 | + | |
350 | + @Override | |
351 | + protected void parseDocument(Document doc, File f) | |
352 | + { | |
353 | + try | |
354 | + { | |
355 | + for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling()) | |
356 | + { | |
357 | + if ("list".equals(n.getNodeName())) | |
358 | + { | |
359 | + for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) | |
360 | + { | |
361 | + if (d.getNodeName().equals("skin")) | |
362 | + { | |
363 | + NamedNodeMap attrs = d.getAttributes(); | |
364 | + StatsSet stats = new StatsSet(); | |
365 | + Node att = attrs.getNamedItem("id"); | |
366 | + if (att == null) | |
367 | + { | |
368 | + LOG.severe("Skin Data: Missing ID for Skin, skipping."); | |
369 | + } | |
370 | + else | |
371 | + { | |
372 | + int id = Integer.parseInt(att.getNodeValue()); | |
373 | + stats.set("id", id); | |
374 | + att = attrs.getNamedItem("name"); | |
375 | + if (att == null) | |
376 | + { | |
377 | + LOG.severe("Skin Data: Missing name for skin id: " + stats.getString("id") + ", skipping."); | |
378 | + } | |
379 | + else | |
380 | + { | |
381 | + stats.set("name", att.getNodeValue()); | |
382 | + att = attrs.getNamedItem("utx_name"); | |
383 | + if (att == null) | |
384 | + { | |
385 | + LOG.severe("Skin Data: Missing name for utx_name id: " + stats.getString("id") + ", skipping."); | |
386 | + } | |
387 | + else | |
388 | + { | |
389 | + stats.set("utx_name", att.getNodeValue()); | |
390 | + att = attrs.getNamedItem("chest"); | |
391 | + if (att == null) | |
392 | + { | |
393 | + LOG.severe("Skin Data: Missing chest for skin id: " + stats.getString("id") + ", skipping."); | |
394 | + } | |
395 | + else | |
396 | + { | |
397 | + stats.set("chest", Integer.parseInt(att.getNodeValue())); | |
398 | + att = attrs.getNamedItem("gloves"); | |
399 | + if (att == null) | |
400 | + { | |
401 | + LOG.severe("Skin Data: Missing gloves for skin id: " + stats.getString("id") + ", skipping."); | |
402 | + } | |
403 | + else | |
404 | + { | |
405 | + stats.set("gloves", Integer.parseInt(att.getNodeValue())); | |
406 | + att = attrs.getNamedItem("legs"); | |
407 | + if (att == null) | |
408 | + { | |
409 | + LOG.severe("Skin Data: Missing legs for skin id: " + stats.getString("id") + ", skipping."); | |
410 | + } | |
411 | + else | |
412 | + { | |
413 | + stats.set("legs", Integer.parseInt(att.getNodeValue())); | |
414 | + att = attrs.getNamedItem("feet"); | |
415 | + if (att == null) | |
416 | + { | |
417 | + LOG.severe("Skin Data: Missing gloves for skin id: " + stats.getString("id") + ", skipping."); | |
418 | + } | |
419 | + else | |
420 | + { | |
421 | + stats.set("feet", Integer.parseInt(att.getNodeValue())); | |
422 | + att = attrs.getNamedItem("hair"); | |
423 | + if (att == null) | |
424 | + { | |
425 | + LOG.severe("Skin Data: Missing hair for skin id: " + stats.getString("id") + ", skipping."); | |
426 | + } | |
427 | + else | |
428 | + { | |
429 | + stats.set("hair", Integer.parseInt(att.getNodeValue())); | |
430 | + att = attrs.getNamedItem("price_id"); | |
431 | + if (att == null) | |
432 | + { | |
433 | + LOG.severe("Skin Data: Missing price_id for skin id: " + stats.getString("id") + ", skipping."); | |
434 | + } | |
435 | + else | |
436 | + { | |
437 | + stats.set("price_id", Integer.parseInt(att.getNodeValue())); | |
438 | + att = attrs.getNamedItem("price"); | |
439 | + if (att == null) | |
440 | + { | |
441 | + LOG.severe("Skin Data: Missing price for skin id: " + stats.getString("id") + ", skipping."); | |
442 | + } | |
443 | + else | |
444 | + { | |
445 | + stats.set("price", Integer.parseInt(att.getNodeValue())); | |
446 | + att = attrs.getNamedItem("isVip"); | |
447 | + if (att == null) | |
448 | + { | |
449 | + LOG.severe("Skin Data: Missing price for isVip id: " + stats.getString("id") + ", skipping."); | |
450 | + } | |
451 | + else | |
452 | + { | |
453 | + stats.set("isVip", Integer.parseInt(att.getNodeValue())); | |
454 | + for (Node data = d.getFirstChild(); data != null; data = data.getNextSibling()) | |
455 | + { | |
456 | + attrs = data.getAttributes(); | |
457 | + if (data.getNodeName().equals("conditions")) | |
458 | + { | |
459 | + for (int i = 0; i < attrs.getLength(); i++) | |
460 | + { | |
461 | + Node node = attrs.item(i); | |
462 | + stats.set(node.getNodeName(), node.getNodeValue()); | |
463 | + } | |
464 | + } | |
465 | + } | |
466 | + Skin skin = new Skin(id, stats); | |
467 | + skinList.put(skin, stats); | |
468 | + } | |
469 | + } | |
470 | + } | |
471 | + } | |
472 | + } | |
473 | + } | |
474 | + } | |
475 | + } | |
476 | + } | |
477 | + } | |
478 | + } | |
479 | + } | |
480 | + } | |
481 | + System.out.println("SkinData: loaded " + skinList.size() + " skins from XML!"); | |
482 | + } | |
483 | + } | |
484 | + } | |
485 | + catch (Exception e) | |
486 | + { | |
487 | + LOG.warning("SkinData: Error while creating table: " + e); | |
488 | + e.printStackTrace(); | |
489 | + } | |
490 | + } | |
491 | + | |
492 | + public Map<Skin, StatsSet> getAllSkins() | |
493 | + { | |
494 | + return skinList; | |
495 | + } | |
496 | + | |
497 | + public void clear() | |
498 | + { | |
499 | + skinList.clear(); | |
500 | + skinList = new HashMap<>(); | |
501 | + } | |
502 | + | |
503 | + public void reload() | |
504 | + { | |
505 | + clear(); | |
506 | + loadDocument("./data/Skins.xml"); | |
507 | + } | |
508 | + | |
509 | + public List<Skin> getSkinList() | |
510 | + { | |
511 | + List<Skin> skins = new ArrayList<>(); | |
512 | + for (Map.Entry<Skin, StatsSet> map : skinList.entrySet()) | |
513 | + { | |
514 | + skins.add(map.getKey()); | |
515 | + } | |
516 | + return skins; | |
517 | + } | |
518 | + | |
519 | + public Skin[] getSkinVec() | |
520 | + { | |
521 | + Skin[] vec = new Skin[getSkinList().size()]; | |
522 | + for (int i = 0; i < getSkinList().size(); i++) | |
523 | + { | |
524 | + vec[i] = getSkinList().get(i); | |
525 | + } | |
526 | + return vec; | |
527 | + } | |
528 | + | |
529 | + public Skin getSkinById(int id) | |
530 | + { | |
531 | + for (Map.Entry<Skin, StatsSet> map : skinList.entrySet()) | |
532 | + { | |
533 | + if (map.getKey().getId() == id) | |
534 | + { | |
535 | + return map.getKey(); | |
536 | + } | |
537 | + } | |
538 | + return null; | |
539 | + } | |
540 | + | |
541 | + public Map<Integer, List<Skin>> getSkinPages() | |
542 | + { | |
543 | + Map<Integer, List<Skin>> skinPages = new HashMap<>(); | |
544 | + int page = 0; | |
545 | + int counter = 0; | |
546 | + for (Skin skin : getInstance().getSkinList()) | |
547 | + { | |
548 | + if (counter >= 10) | |
549 | + { | |
550 | + page++; | |
551 | + counter = 0; | |
552 | + } | |
553 | + if (skinPages.get(Integer.valueOf(page)) == null) | |
554 | + { | |
555 | + skinPages.put(Integer.valueOf(page), new ArrayList<>()); | |
556 | + } | |
557 | + skinPages.get(Integer.valueOf(page)).add(skin); | |
558 | + counter++; | |
559 | + } | |
560 | + return skinPages; | |
561 | + } | |
562 | +} | |
563 | diff --git a/src/Base/Util/Mysql.java b/src/Base/Util/Mysql.java | |
564 | new file mode 100644 | |
565 | index 0000000..31aba5f | |
566 | --- /dev/null | |
567 | +++ b/src/Base/Util/Mysql.java | |
568 | @@ -0,0 +1,198 @@ | |
569 | +package Base.Util; | |
570 | + | |
571 | +import java.sql.Connection; | |
572 | +import java.sql.PreparedStatement; | |
573 | +import java.sql.ResultSet; | |
574 | +import java.sql.SQLException; | |
575 | +import java.sql.Statement; | |
576 | +import java.util.logging.Logger; | |
577 | + | |
578 | +import l2jorion.util.database.L2DatabaseFactory; | |
579 | + | |
580 | +public abstract class Mysql | |
581 | +{ | |
582 | + public static final Logger _log = Logger.getLogger(Mysql.class.getName()); | |
583 | + | |
584 | + /** | |
585 | + * Performs a simple sql queries where unnecessary control parameters <BR> | |
586 | + * NOTE: In this method, the parameters passed are not valid for SQL-injection! | |
587 | + * @param db | |
588 | + * @param query | |
589 | + * @param vars | |
590 | + * @return | |
591 | + */ | |
592 | + public static boolean setEx(L2DatabaseFactory db, String query, Object... vars) | |
593 | + { | |
594 | + Connection con = null; | |
595 | + Statement statement = null; | |
596 | + PreparedStatement pstatement = null; | |
597 | + boolean successed = true; | |
598 | + | |
599 | + try | |
600 | + { | |
601 | + if (db == null) | |
602 | + { | |
603 | + db = L2DatabaseFactory.getInstance(); | |
604 | + } | |
605 | + | |
606 | + con = db.getConnection(); | |
607 | + if (vars.length == 0) | |
608 | + { | |
609 | + statement = con.createStatement(); | |
610 | + statement.executeUpdate(query); | |
611 | + statement.close(); | |
612 | + } | |
613 | + else | |
614 | + { | |
615 | + pstatement = con.prepareStatement(query); | |
616 | + setVars(pstatement, vars); | |
617 | + pstatement.executeUpdate(); | |
618 | + pstatement.close(); | |
619 | + } | |
620 | + con.close(); | |
621 | + } | |
622 | + catch (Exception e) | |
623 | + { | |
624 | + _log.warning("Could not execute update '" + query + "': " + e); | |
625 | + e.printStackTrace(); | |
626 | + successed = false; | |
627 | + } | |
628 | + finally | |
629 | + { | |
630 | + closeQuietly(con, pstatement); | |
631 | + closeQuietly(statement); | |
632 | + } | |
633 | + return successed; | |
634 | + } | |
635 | + | |
636 | + public static void setVars(PreparedStatement statement, Object... vars) throws SQLException | |
637 | + { | |
638 | + Number n; | |
639 | + long long_val; | |
640 | + double double_val; | |
641 | + for (int i = 0; i < vars.length; i++) | |
642 | + { | |
643 | + if (vars[i] instanceof Number) | |
644 | + { | |
645 | + n = (Number) vars[i]; | |
646 | + long_val = n.longValue(); | |
647 | + double_val = n.doubleValue(); | |
648 | + if (long_val == double_val) | |
649 | + { | |
650 | + statement.setLong(i + 1, long_val); | |
651 | + } | |
652 | + else | |
653 | + { | |
654 | + statement.setDouble(i + 1, double_val); | |
655 | + } | |
656 | + } | |
657 | + else if (vars[i] instanceof String) | |
658 | + { | |
659 | + statement.setString(i + 1, (String) vars[i]); | |
660 | + } | |
661 | + } | |
662 | + } | |
663 | + | |
664 | + public static boolean set(String query, Object... vars) | |
665 | + { | |
666 | + return setEx(null, query, vars); | |
667 | + } | |
668 | + | |
669 | + public static boolean set(String query) | |
670 | + { | |
671 | + return setEx(null, query); | |
672 | + } | |
673 | + | |
674 | + public static void closeQuietly(Connection conn) | |
675 | + { | |
676 | + try | |
677 | + { | |
678 | + close(conn); | |
679 | + } | |
680 | + catch (SQLException e) | |
681 | + { // NOPMD | |
682 | + // quiet | |
683 | + } | |
684 | + } | |
685 | + | |
686 | + public static void closeQuietly(Connection conn, Statement stmt, ResultSet rs) | |
687 | + { | |
688 | + | |
689 | + try | |
690 | + { | |
691 | + closeQuietly(rs); | |
692 | + } | |
693 | + finally | |
694 | + { | |
695 | + try | |
696 | + { | |
697 | + closeQuietly(stmt); | |
698 | + } | |
699 | + finally | |
700 | + { | |
701 | + closeQuietly(conn); | |
702 | + } | |
703 | + } | |
704 | + } | |
705 | + | |
706 | + public static void closeQuietly(Connection conn, Statement stmt) | |
707 | + { | |
708 | + try | |
709 | + { | |
710 | + closeQuietly(stmt); | |
711 | + } | |
712 | + finally | |
713 | + { | |
714 | + closeQuietly(conn); | |
715 | + } | |
716 | + } | |
717 | + | |
718 | + public static void closeQuietly(ResultSet rs) | |
719 | + { | |
720 | + try | |
721 | + { | |
722 | + close(rs); | |
723 | + } | |
724 | + catch (SQLException e) | |
725 | + { // NOPMD | |
726 | + // quiet | |
727 | + } | |
728 | + } | |
729 | + | |
730 | + public static void closeQuietly(Statement stmt) | |
731 | + { | |
732 | + try | |
733 | + { | |
734 | + close(stmt); | |
735 | + } | |
736 | + catch (SQLException e) | |
737 | + { // NOPMD | |
738 | + // quiet | |
739 | + } | |
740 | + } | |
741 | + | |
742 | + public static void close(Connection conn) throws SQLException | |
743 | + { | |
744 | + if (conn != null) | |
745 | + { | |
746 | + conn.close(); | |
747 | + } | |
748 | + } | |
749 | + | |
750 | + public static void close(ResultSet rs) throws SQLException | |
751 | + { | |
752 | + if (rs != null) | |
753 | + { | |
754 | + rs.close(); | |
755 | + } | |
756 | + } | |
757 | + | |
758 | + public static void close(Statement stmt) throws SQLException | |
759 | + { | |
760 | + if (stmt != null) | |
761 | + { | |
762 | + stmt.close(); | |
763 | + } | |
764 | + } | |
765 | + | |
766 | +} | |
767 | \ No newline at end of file | |
768 | diff --git a/src/Base/XML/XMLDocument.java b/src/Base/XML/XMLDocument.java | |
769 | new file mode 100644 | |
770 | index 0000000..2e9bb7a | |
771 | --- /dev/null | |
772 | +++ b/src/Base/XML/XMLDocument.java | |
773 | @@ -0,0 +1,137 @@ | |
774 | +package Base.XML; | |
775 | + | |
776 | +import java.io.File; | |
777 | +import java.util.function.Consumer; | |
778 | +import java.util.function.Predicate; | |
779 | +import java.util.logging.Level; | |
780 | +import java.util.logging.Logger; | |
781 | + | |
782 | +import javax.xml.parsers.DocumentBuilderFactory; | |
783 | + | |
784 | +import org.w3c.dom.Document; | |
785 | +import org.w3c.dom.NamedNodeMap; | |
786 | +import org.w3c.dom.Node; | |
787 | +import org.w3c.dom.NodeList; | |
788 | + | |
789 | +import l2jorion.game.templates.StatsSet; | |
790 | + | |
791 | +/** | |
792 | + * An XML document, relying on a static and single DocumentBuilderFactory. | |
793 | + */ | |
794 | +public abstract class XMLDocument | |
795 | +{ | |
796 | + protected static final Logger LOG = Logger.getLogger(XMLDocument.class.getName()); | |
797 | + | |
798 | + private static final DocumentBuilderFactory BUILDER; | |
799 | + static | |
800 | + { | |
801 | + BUILDER = DocumentBuilderFactory.newInstance(); | |
802 | + BUILDER.setValidating(false); | |
803 | + BUILDER.setIgnoringComments(true); | |
804 | + } | |
805 | + | |
806 | + abstract protected void load(); | |
807 | + | |
808 | + abstract protected void parseDocument(Document doc, File f); | |
809 | + | |
810 | + public void loadDocument(String filePath) | |
811 | + { | |
812 | + loadDocument(new File(filePath)); | |
813 | + } | |
814 | + | |
815 | + /** | |
816 | + * Parse an entire directory or file if found. | |
817 | + * @param file | |
818 | + */ | |
819 | + public void loadDocument(File file) | |
820 | + { | |
821 | + if (!file.exists()) | |
822 | + { | |
823 | + LOG.severe("The following file or directory doesn't exist: " + file.getName()); | |
824 | + return; | |
825 | + } | |
826 | + | |
827 | + if (file.isDirectory()) | |
828 | + { | |
829 | + for (File f : file.listFiles()) | |
830 | + { | |
831 | + loadDocument(f); | |
832 | + } | |
833 | + } | |
834 | + else if (file.isFile()) | |
835 | + { | |
836 | + try | |
837 | + { | |
838 | + parseDocument(BUILDER.newDocumentBuilder().parse(file), file); | |
839 | + } | |
840 | + catch (Exception e) | |
841 | + { | |
842 | + LOG.log(Level.SEVERE, "Error loading XML file " + file.getName(), e); | |
843 | + } | |
844 | + } | |
845 | + } | |
846 | + | |
847 | + public void forEach(Node node, Consumer<Node> action) | |
848 | + { | |
849 | + forEach(node, a -> true, action); | |
850 | + } | |
851 | + | |
852 | + public void forEach(Node node, String nodeName, Consumer<Node> action) | |
853 | + { | |
854 | + forEach(node, innerNode -> | |
855 | + { | |
856 | + if (nodeName.contains("|")) | |
857 | + { | |
858 | + final String[] nodeNames = nodeName.split("\\|"); | |
859 | + for (String name : nodeNames) | |
860 | + { | |
861 | + if (!name.isEmpty() && name.equals(innerNode.getNodeName())) | |
862 | + { | |
863 | + return true; | |
864 | + } | |
865 | + } | |
866 | + return false; | |
867 | + } | |
868 | + return nodeName.equals(innerNode.getNodeName()); | |
869 | + }, action); | |
870 | + } | |
871 | + | |
872 | + public void forEach(Node node, Predicate<Node> filter, Consumer<Node> action) | |
873 | + { | |
874 | + final NodeList list = node.getChildNodes(); | |
875 | + for (int i = 0; i < list.getLength(); i++) | |
876 | + { | |
877 | + final Node targetNode = list.item(i); | |
878 | + if (filter.test(targetNode)) | |
879 | + { | |
880 | + action.accept(targetNode); | |
881 | + } | |
882 | + } | |
883 | + } | |
884 | + | |
885 | + public StatsSet parseAttributes(Node node) | |
886 | + { | |
887 | + final NamedNodeMap attrs = node.getAttributes(); | |
888 | + final StatsSet map = new StatsSet(); | |
889 | + for (int i = 0; i < attrs.getLength(); i++) | |
890 | + { | |
891 | + final Node att = attrs.item(i); | |
892 | + map.set(att.getNodeName(), att.getNodeValue()); | |
893 | + } | |
894 | + return map; | |
895 | + } | |
896 | + | |
897 | + /** | |
898 | + * This method parses the content of a NamedNodeMap and feed the given StatsSet. | |
899 | + * @param attrs : The NamedNodeMap to parse. | |
900 | + * @param set : The StatsSet to feed. | |
901 | + */ | |
902 | + public static void parseAndFeed(NamedNodeMap attrs, StatsSet set) | |
903 | + { | |
904 | + for (int i = 0; i < attrs.getLength(); i++) | |
905 | + { | |
906 | + final Node attr = attrs.item(i); | |
907 | + set.set(attr.getNodeName(), attr.getNodeValue()); | |
908 | + } | |
909 | + } | |
910 | +} | |
911 | \ No newline at end of file | |
912 | diff --git a/src/l2jorion/Config.java b/src/l2jorion/Config.java | |
913 | index bbf70a0..a713d3e 100644 | |
914 | --- a/src/l2jorion/Config.java | |
915 | +++ b/src/l2jorion/Config.java | |
916 | @@ -2358,6 +2358,10 @@ | |
917 | public static String PM_TEXT2; | |
918 | public static boolean NEW_PLAYER_EFFECT; | |
919 | ||
920 | + public static String TEXTURE_SKIN_PACKAGE; | |
921 | + | |
922 | + public static String ACQUIRED_SKIN_SUFFIX; | |
923 | + | |
924 | public static void loadL2jOrionConfig() | |
925 | { | |
926 | final String L2jOrion = ConfigLoader.L2jOrion_CONFIG_FILE; | |
927 | @@ -2381,6 +2385,9 @@ | |
928 | LIST_FAKE_ARMOR_ITEMS.add(Integer.parseInt(id)); | |
929 | } | |
930 | ||
931 | + TEXTURE_SKIN_PACKAGE = L2jOrionSettings.getProperty("TextureSkinPackageName", "MAYKE_MENDES_SKIN"); | |
932 | + ACQUIRED_SKIN_SUFFIX = L2jOrionSettings.getProperty("TextureSkinSuffixName", "_f"); | |
933 | + | |
934 | FREE_TELEPORT_UNTIL = Integer.parseInt(L2jOrionSettings.getProperty("FreeTeleportUntil", "1")); | |
935 | REMOVAL_AUGMENTATION_FREE = Boolean.parseBoolean(L2jOrionSettings.getProperty("RemovalAugmentationFree", "False")); | |
936 | ALLOW_FREIGHT_AUGMENTED = Boolean.parseBoolean(L2jOrionSettings.getProperty("AllowFreightAugmentedItem", "False")); | |
937 | diff --git a/src/l2jorion/game/GameServer.java b/src/l2jorion/game/GameServer.java | |
938 | index 214bbfe..99c3a68 100644 | |
939 | --- a/src/l2jorion/game/GameServer.java | |
940 | +++ b/src/l2jorion/game/GameServer.java | |
941 | @@ -30,6 +30,7 @@ | |
942 | import java.util.Date; | |
943 | import java.util.logging.LogManager; | |
944 | ||
945 | +import Base.SkinBeauty.SkinData; | |
946 | import hwid.hwid; | |
947 | import l2jorion.Config; | |
948 | import l2jorion.ConfigLoader; | |
949 | @@ -467,6 +468,9 @@ | |
950 | Util.printSection("Scripts"); | |
951 | QuestManager.getInstance(); | |
952 | ||
953 | + Util.printSection("Skin Manager"); | |
954 | + SkinData.getInstance(); | |
955 | + | |
956 | // Donate Items | |
957 | TaskItemDonate.getInstance(); | |
958 | ||
959 | diff --git a/src/l2jorion/game/handler/ItemHandler.java b/src/l2jorion/game/handler/ItemHandler.java | |
960 | index 041c584..eedc4e4 100644 | |
961 | --- a/src/l2jorion/game/handler/ItemHandler.java | |
962 | +++ b/src/l2jorion/game/handler/ItemHandler.java | |
963 | @@ -65,6 +65,7 @@ | |
964 | import l2jorion.game.handler.item.Scrolls; | |
965 | import l2jorion.game.handler.item.Seed; | |
966 | import l2jorion.game.handler.item.SevenSignsRecord; | |
967 | +import l2jorion.game.handler.item.Skins; | |
968 | import l2jorion.game.handler.item.SoulCrystals; | |
969 | import l2jorion.game.handler.item.SoulShots; | |
970 | import l2jorion.game.handler.item.SpecialXMas; | |
971 | @@ -134,6 +135,7 @@ | |
972 | registerItemHandler(new ChristmasTree()); | |
973 | registerItemHandler(new Crystals()); | |
974 | registerItemHandler(new HsItems()); | |
975 | + registerItemHandler(new Skins()); | |
976 | ||
977 | LOG.info("ItemHandler: Loaded " + _datatable.size() + " handlers"); | |
978 | } | |
979 | diff --git a/src/l2jorion/game/handler/item/Skins.java b/src/l2jorion/game/handler/item/Skins.java | |
980 | new file mode 100644 | |
981 | index 0000000..187d84e | |
982 | --- /dev/null | |
983 | +++ b/src/l2jorion/game/handler/item/Skins.java | |
984 | @@ -0,0 +1,222 @@ | |
985 | +package l2jorion.game.handler.item; | |
986 | + | |
987 | +import Base.SkinBeauty.Skin; | |
988 | +import Base.SkinBeauty.SkinData; | |
989 | + | |
990 | +import l2jorion.game.handler.IItemHandler; | |
991 | + | |
992 | +import l2jorion.game.model.actor.instance.L2ItemInstance; | |
993 | +import l2jorion.game.model.actor.instance.L2PcInstance; | |
994 | +import l2jorion.game.model.actor.instance.L2PlayableInstance; | |
995 | +import l2jorion.game.network.serverpackets.MagicSkillUser; | |
996 | +import l2jorion.game.thread.ThreadPoolManager; | |
997 | + | |
998 | +/** | |
999 | + * @author Williams and Stinkymadness | |
1000 | + */ | |
1001 | +public class Skins implements IItemHandler | |
1002 | +{ | |
1003 | + private static final int ITEM_IDS[] = | |
1004 | + { | |
1005 | + 19000, | |
1006 | + 19001, | |
1007 | + 19002, | |
1008 | + 19003, | |
1009 | + 19004, | |
1010 | + 19005, | |
1011 | + 19006, | |
1012 | + 19007, | |
1013 | + 19008, | |
1014 | + 19009, | |
1015 | + 19010, | |
1016 | + 19011, | |
1017 | + 19012, | |
1018 | + 19013, | |
1019 | + 19014, | |
1020 | + 19015, | |
1021 | + 19016, | |
1022 | + 19017, | |
1023 | + 19018, | |
1024 | + 19019, | |
1025 | + 19020, | |
1026 | + 19021, | |
1027 | + 19022, | |
1028 | + 19023, | |
1029 | + 19024, | |
1030 | + 19025, | |
1031 | + 19026, | |
1032 | + 19027, | |
1033 | + 19028, | |
1034 | + 19029, | |
1035 | + 19030, | |
1036 | + 19031, | |
1037 | + 19033, | |
1038 | + 19034, | |
1039 | + 19035, | |
1040 | + 19036, | |
1041 | + 19037, | |
1042 | + 19038, | |
1043 | + 19039, | |
1044 | + 19040, | |
1045 | + 19041, | |
1046 | + 19042, | |
1047 | + 19043, | |
1048 | + 19044, | |
1049 | + 19045, | |
1050 | + 19046, | |
1051 | + 19047, | |
1052 | + 19048, | |
1053 | + 19049, | |
1054 | + 19050, | |
1055 | + 19051, | |
1056 | + 19052, | |
1057 | + 19053, | |
1058 | + 19054, | |
1059 | + 19055, | |
1060 | + 19056, | |
1061 | + 19057, | |
1062 | + 19058, | |
1063 | + 19059, | |
1064 | + 19060, | |
1065 | + 19061, | |
1066 | + 19062, | |
1067 | + 19063, | |
1068 | + 19064, | |
1069 | + 19065, | |
1070 | + 19066, | |
1071 | + 19067, | |
1072 | + 19068, | |
1073 | + 19069, | |
1074 | + 19070, | |
1075 | + 19071, | |
1076 | + 19072, | |
1077 | + 19073, | |
1078 | + 19074, | |
1079 | + 19075, | |
1080 | + 19076, | |
1081 | + 19077, | |
1082 | + 19078, | |
1083 | + 19079, | |
1084 | + 19080, | |
1085 | + 19081, | |
1086 | + 19082, | |
1087 | + 19083, | |
1088 | + 19084, | |
1089 | + 19085, | |
1090 | + 19086, | |
1091 | + 19087, | |
1092 | + 19088, | |
1093 | + 19089, | |
1094 | + 19090, | |
1095 | + 19091, | |
1096 | + 19092, | |
1097 | + 19093, | |
1098 | + 19094, | |
1099 | + 19095, | |
1100 | + 19096, | |
1101 | + 19097, | |
1102 | + 19098, | |
1103 | + 19099, | |
1104 | + 19100, | |
1105 | + 19101, | |
1106 | + 19102, | |
1107 | + 19103, | |
1108 | + 19104, | |
1109 | + 19105, | |
1110 | + 19106, | |
1111 | + 19107, | |
1112 | + 19108, | |
1113 | + 19109, | |
1114 | + 19110, | |
1115 | + 19111, | |
1116 | + 19112, | |
1117 | + 19113, | |
1118 | + 19114, | |
1119 | + 19115, | |
1120 | + 19116, | |
1121 | + 19117, | |
1122 | + 19118, | |
1123 | + 19119, | |
1124 | + 19120, | |
1125 | + 19121, | |
1126 | + 19122, | |
1127 | + 19123, | |
1128 | + 19124, | |
1129 | + 19125, | |
1130 | + 19126, | |
1131 | + 19127, | |
1132 | + 19128, | |
1133 | + 19129, | |
1134 | + 19130, | |
1135 | + 19131, | |
1136 | + 19132, | |
1137 | + 19133, | |
1138 | + 19134, | |
1139 | + 19135, | |
1140 | + 19136, | |
1141 | + 19137, | |
1142 | + 19138, | |
1143 | + 19139, | |
1144 | + 19140, | |
1145 | + 19141, | |
1146 | + 15020, | |
1147 | + 29142 | |
1148 | + | |
1149 | + }; | |
1150 | + | |
1151 | + public static void VisualTeste(L2PcInstance player) | |
1152 | + { | |
1153 | + Skin free = SkinData.getInstance().getSkinById(0); | |
1154 | + player.setActiveSkin(free); | |
1155 | + player.broadcastUserInfo(); | |
1156 | + } | |
1157 | + | |
1158 | + @Override | |
1159 | + public void useItem(L2PlayableInstance playable, L2ItemInstance item) | |
1160 | + { | |
1161 | + final L2PcInstance player = (L2PcInstance) playable; | |
1162 | + | |
1163 | + ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() | |
1164 | + { | |
1165 | + @Override | |
1166 | + public void run() | |
1167 | + { | |
1168 | + playable.setIsImmobileUntilAttacked(false); | |
1169 | + } | |
1170 | + }, 1100); | |
1171 | + | |
1172 | + if (!(playable instanceof L2PcInstance)) | |
1173 | + { | |
1174 | + return; | |
1175 | + } | |
1176 | + | |
1177 | + final Skin dress = SkinData.getInstance().getSkinById(item.getItemId()); | |
1178 | + | |
1179 | + if (dress == null) | |
1180 | + { | |
1181 | + return; | |
1182 | + } | |
1183 | + | |
1184 | + if (!player.isDressMeEnabled()) | |
1185 | + { | |
1186 | + player.setActiveSkin(dress); | |
1187 | + playable.setIsImmobileUntilAttacked(true); | |
1188 | + player.broadcastPacket(new MagicSkillUser(player, player, 1047, 1, 1100, 0)); | |
1189 | + player.broadcastUserInfo(); | |
1190 | + } | |
1191 | + else | |
1192 | + { | |
1193 | + player.setActiveSkin(dress); | |
1194 | + playable.setIsImmobileUntilAttacked(true); | |
1195 | + player.broadcastPacket(new MagicSkillUser(player, player, 1047, 1, 1100, 0)); | |
1196 | + player.broadcastUserInfo(); | |
1197 | + } | |
1198 | + | |
1199 | + } | |
1200 | + | |
1201 | + @Override | |
1202 | + public int[] getItemIds() | |
1203 | + { | |
1204 | + return ITEM_IDS; | |
1205 | + } | |
1206 | +} | |
1207 | \ No newline at end of file | |
1208 | diff --git a/src/l2jorion/game/model/actor/instance/L2BeautyShopInstance.java b/src/l2jorion/game/model/actor/instance/L2BeautyShopInstance.java | |
1209 | new file mode 100644 | |
1210 | index 0000000..867e34d | |
1211 | --- /dev/null | |
1212 | +++ b/src/l2jorion/game/model/actor/instance/L2BeautyShopInstance.java | |
1213 | @@ -0,0 +1,251 @@ | |
1214 | +package l2jorion.game.model.actor.instance; | |
1215 | + | |
1216 | +import java.util.List; | |
1217 | +import java.util.concurrent.ScheduledFuture; | |
1218 | + | |
1219 | +import Base.SkinBeauty.Skin; | |
1220 | +import Base.SkinBeauty.SkinData; | |
1221 | +import l2jorion.Config; | |
1222 | +import l2jorion.game.ai.CtrlIntention; | |
1223 | +import l2jorion.game.model.PcInventory; | |
1224 | +import l2jorion.game.network.serverpackets.ActionFailed; | |
1225 | +import l2jorion.game.network.serverpackets.MoveToPawn; | |
1226 | +import l2jorion.game.network.serverpackets.MyTargetSelected; | |
1227 | +import l2jorion.game.network.serverpackets.NpcHtmlMessage; | |
1228 | +import l2jorion.game.network.serverpackets.ValidateLocation; | |
1229 | +import l2jorion.game.templates.L2NpcTemplate; | |
1230 | + | |
1231 | +public class L2BeautyShopInstance extends L2NpcInstance | |
1232 | +{ | |
1233 | + ScheduledFuture<?> task; | |
1234 | + | |
1235 | + public L2BeautyShopInstance(int objectId, L2NpcTemplate template) | |
1236 | + { | |
1237 | + super(objectId, template); | |
1238 | + } | |
1239 | + | |
1240 | + @Override | |
1241 | + public void onAction(L2PcInstance player) | |
1242 | + { | |
1243 | + if (this != player.getTarget()) | |
1244 | + { | |
1245 | + player.setTarget(this); | |
1246 | + player.sendPacket(new MyTargetSelected(getObjectId(), 0)); | |
1247 | + player.sendPacket(new ValidateLocation(this)); | |
1248 | + } | |
1249 | + else if (!canInteract(player)) | |
1250 | + { | |
1251 | + player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this); | |
1252 | + } | |
1253 | + else | |
1254 | + { | |
1255 | + player.sendPacket(new MoveToPawn(player, this, 150)); | |
1256 | + if (hasRandomAnimation()) | |
1257 | + { | |
1258 | + onRandomAnimation(); | |
1259 | + } | |
1260 | + showMainWindow(player, 0); | |
1261 | + player.sendPacket(ActionFailed.STATIC_PACKET); | |
1262 | + } | |
1263 | + } | |
1264 | + | |
1265 | + public static String getIconPath(L2PcInstance player, Skin skin) | |
1266 | + { | |
1267 | + if (player.containsSkin(skin)) | |
1268 | + { | |
1269 | + return skin.getUtxName(); | |
1270 | + } | |
1271 | + return skin.getUtxName() + Config.ACQUIRED_SKIN_SUFFIX; | |
1272 | + } | |
1273 | + | |
1274 | + public static String showButtons(L2PcInstance player, Skin skin) | |
1275 | + { | |
1276 | + StringBuilder sb = new StringBuilder(); | |
1277 | + if (!player.getSkins().contains(skin)) | |
1278 | + { | |
1279 | + sb.append("<tr>"); | |
1280 | + sb.append("<td align=center><button value=\"Buy\" action=\"bypass -h acquireSkin " + skin.getId() + "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>"); | |
1281 | + sb.append("<td align=center><button value=\"Try\" action=\"bypass -h trySkin " + skin.getId() + "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>"); | |
1282 | + sb.append("</tr>"); | |
1283 | + sb.append("<tr>"); | |
1284 | + sb.append("<td align=center><button value=\"Equip\" action=\"bypass -h equipSkin " + skin.getId() + "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>"); | |
1285 | + sb.append("<td align=center><button value=\"Unequip\" action=\"bypass -h unequipSkin " + skin.getId() + "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>"); | |
1286 | + sb.append("</tr>"); | |
1287 | + } | |
1288 | + else | |
1289 | + { | |
1290 | + sb.append("<tr>"); | |
1291 | + sb.append("<td align=center><button value=\"Equip\" action=\"bypass -h equipSkin " + skin.getId() + "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>"); | |
1292 | + sb.append("<td align=center><button value=\"Unequip\" action=\"bypass -h unequipSkin " + skin.getId() + "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>"); | |
1293 | + sb.append("</tr>"); | |
1294 | + } | |
1295 | + return sb.toString(); | |
1296 | + } | |
1297 | + | |
1298 | + public static String generatePagesHtml(L2PcInstance player) | |
1299 | + { | |
1300 | + StringBuilder sb = new StringBuilder(); | |
1301 | + for (Integer i : SkinData.getInstance().getSkinPages().keySet()) | |
1302 | + { | |
1303 | + sb.append("<td>"); | |
1304 | + sb.append("<table width=21 align=left >"); | |
1305 | + sb.append("<tr>"); | |
1306 | + sb.append("<td width=21 align=left><button value=\"Page " + i + "\" action=\"bypass -h skinPage " + i + "\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>"); | |
1307 | + sb.append("</tr>"); | |
1308 | + sb.append("</table>"); | |
1309 | + sb.append("</td>"); | |
1310 | + } | |
1311 | + return sb.toString(); | |
1312 | + } | |
1313 | + | |
1314 | + public static String generateSkinsHtml(L2PcInstance player, int page) | |
1315 | + { | |
1316 | + StringBuilder sb = new StringBuilder(); | |
1317 | + int i = 0; | |
1318 | + List<Skin> list = SkinData.getInstance().getSkinPages().get(Integer.valueOf(page)); | |
1319 | + for (Skin skin : list) | |
1320 | + { | |
1321 | + sb.append("<tr>"); | |
1322 | + sb.append("<td>"); | |
1323 | + sb.append("<img src=\"L2UI.SquareGray\" width=295 height=1>"); | |
1324 | + if (i % 2 == 0) | |
1325 | + { | |
1326 | + sb.append("<table align=center height=40 bgcolor=000000>"); | |
1327 | + } | |
1328 | + else | |
1329 | + { | |
1330 | + sb.append("<table align=center height=40"); | |
1331 | + } | |
1332 | + sb.append("<tr>"); | |
1333 | + sb.append("<td width=40>"); | |
1334 | + sb.append("<img src=\"" + Config.TEXTURE_SKIN_PACKAGE + "." + getIconPath(player, skin) + "\" width=32 height=32/>"); | |
1335 | + sb.append("</td>"); | |
1336 | + sb.append("<td width=180>"); | |
1337 | + sb.append("<font color=LEVEL>" + getSkinName(skin) + "</font><br1>Price:" + skin.getPrice() + " " + skin.getPriceItemName()); | |
1338 | + if (player.getSkins().contains(skin)) | |
1339 | + { | |
1340 | + sb.append("<font color=ff0000>(Acquired)</font>"); | |
1341 | + } | |
1342 | + sb.append("</td>"); | |
1343 | + sb.append("<td align=center width=100 valign=center>"); | |
1344 | + sb.append("<button value=\"Open \" action=\"bypass -h skinhtm " + skin.getId() + "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\">"); | |
1345 | + sb.append("</td>"); | |
1346 | + sb.append("</tr>"); | |
1347 | + sb.append("</table>"); | |
1348 | + sb.append("</td>"); | |
1349 | + sb.append("</tr>"); | |
1350 | + i++; | |
1351 | + } | |
1352 | + return sb.toString(); | |
1353 | + } | |
1354 | + | |
1355 | + public static String getSkinName(Skin skin) | |
1356 | + { | |
1357 | + if (skin.isVip()) | |
1358 | + { | |
1359 | + return skin.getName() + "<font color=\"ff0000\"> (VIP)</font>"; | |
1360 | + } | |
1361 | + return skin.getName(); | |
1362 | + } | |
1363 | + | |
1364 | + public void showMainWindow(L2PcInstance player, int page) | |
1365 | + { | |
1366 | + String filename = "data/html/SkinManager/Main.htm"; | |
1367 | + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); | |
1368 | + html.setFile(filename); | |
1369 | + html.replace("%objectId%", String.valueOf(getObjectId())); | |
1370 | + html.replace("%npcId%", String.valueOf(getNpcId())); | |
1371 | + html.replace("%npcname%", getName()); | |
1372 | + html.replace("%hat%", player.isActiveHat() ? "ON" : "OFF"); | |
1373 | + html.replace("%skins%", generateSkinsHtml(player, page)); | |
1374 | + html.replace("%pages%", generatePagesHtml(player)); | |
1375 | + player.sendPacket(html); | |
1376 | + filename = null; | |
1377 | + html = null; | |
1378 | + } | |
1379 | + | |
1380 | + @Override | |
1381 | + public void onBypassFeedback(L2PcInstance activeChar, String _command) | |
1382 | + { | |
1383 | + } | |
1384 | + | |
1385 | + public static boolean reduceItem(L2PcInstance player, int itemId, int itemPrice) | |
1386 | + { | |
1387 | + PcInventory inv = player.getInventory(); | |
1388 | + try | |
1389 | + { | |
1390 | + if (inv.getItemByItemId(itemId) == null) | |
1391 | + { | |
1392 | + player.sendMessage("You don't have required items!"); | |
1393 | + return false; | |
1394 | + } | |
1395 | + if (inv.getItemByItemId(itemId).getCount() < itemPrice) | |
1396 | + { | |
1397 | + player.sendMessage("You don't have required items!"); | |
1398 | + return false; | |
1399 | + } | |
1400 | + player.destroyItemByItemId("skin buy", itemId, itemPrice, player, true); | |
1401 | + return true; | |
1402 | + } | |
1403 | + catch (Exception e) | |
1404 | + { | |
1405 | + e.printStackTrace(); | |
1406 | + return false; | |
1407 | + } | |
1408 | + } | |
1409 | + | |
1410 | + public static boolean equipSkin(L2PcInstance activeChar, int id, boolean trying) | |
1411 | + { | |
1412 | + Skin skin = SkinData.getInstance().getSkinById(id); | |
1413 | + | |
1414 | + if (activeChar.getSkinId() == 0) | |
1415 | + { | |
1416 | + Skin dress = SkinData.getInstance().getSkinById(id); | |
1417 | + activeChar.setActiveSkin(dress); | |
1418 | + | |
1419 | + } | |
1420 | + if (trying) | |
1421 | + { | |
1422 | + Skin dress = SkinData.getInstance().getSkinById(id); | |
1423 | + activeChar.setActiveSkin(dress); | |
1424 | + activeChar.setActiveHat(true); | |
1425 | + activeChar.setDressMeEnabled(true); | |
1426 | + activeChar.broadcastUserInfo(); | |
1427 | + activeChar.setSkinId(skin.getId()); | |
1428 | + return true; | |
1429 | + } | |
1430 | + if (activeChar.isDressMeEnabled() && !trying) | |
1431 | + { | |
1432 | + activeChar.sendMessage("First unequip your actual skin!"); | |
1433 | + return false; | |
1434 | + } | |
1435 | + if (activeChar.getSkins().contains(skin)) | |
1436 | + { | |
1437 | + Skin dress = SkinData.getInstance().getSkinById(id); | |
1438 | + activeChar.setActiveSkin(dress); | |
1439 | + activeChar.setActiveHat(true); | |
1440 | + activeChar.setDressMeEnabled(true); | |
1441 | + activeChar.broadcastUserInfo(); | |
1442 | + activeChar.setSkinId(skin.getId()); | |
1443 | + activeChar.sendMessage("Skin " + skin.getStats().getString("name") + " equiped!"); | |
1444 | + return true; | |
1445 | + } | |
1446 | + activeChar.sendMessage("You don't own this skin!"); | |
1447 | + return false; | |
1448 | + } | |
1449 | + | |
1450 | + @Override | |
1451 | + public String getHtmlPath(L2PcInstance player, int npcId, int val) | |
1452 | + { | |
1453 | + String pom = ""; | |
1454 | + if (val == 0) | |
1455 | + { | |
1456 | + pom = "" + npcId; | |
1457 | + } | |
1458 | + else | |
1459 | + { | |
1460 | + pom = npcId + "-" + val; | |
1461 | + } | |
1462 | + return "data/html/SkinManager/" + pom + ".htm"; | |
1463 | + } | |
1464 | +} | |
1465 | diff --git a/src/l2jorion/game/model/actor/instance/L2PcInstance.java b/src/l2jorion/game/model/actor/instance/L2PcInstance.java | |
1466 | index 8d9b411..eb7f14f 100644 | |
1467 | --- a/src/l2jorion/game/model/actor/instance/L2PcInstance.java | |
1468 | +++ b/src/l2jorion/game/model/actor/instance/L2PcInstance.java | |
1469 | @@ -40,6 +40,9 @@ | |
1470 | import java.util.concurrent.TimeUnit; | |
1471 | import java.util.concurrent.locks.ReentrantLock; | |
1472 | ||
1473 | +import Base.SkinBeauty.Skin; | |
1474 | +import Base.SkinBeauty.SkinData; | |
1475 | +import Base.Util.Mysql; | |
1476 | import javolution.text.TextBuilder; | |
1477 | import javolution.util.FastList; | |
1478 | import javolution.util.FastMap; | |
1479 | @@ -10027,7 +10030,7 @@ | |
1480 | } | |
1481 | ||
1482 | CursedWeaponsManager.getInstance().checkPlayer(player); | |
1483 | - | |
1484 | + player.loadSkins(); | |
1485 | player.setAllianceWithVarkaKetra(rset.getInt("varka_ketra_ally")); | |
1486 | ||
1487 | player.setDeathPenaltyBuffLevel(rset.getInt("death_penalty_level")); | |
1488 | @@ -10314,6 +10317,8 @@ | |
1489 | storeCharBase(); | |
1490 | storeCharSub(); | |
1491 | ||
1492 | + saveSkins(); | |
1493 | + | |
1494 | // Dont store effect if the char was on Offline trade | |
1495 | if (!isStored()) | |
1496 | { | |
1497 | @@ -21169,6 +21174,134 @@ | |
1498 | _dressed = val; | |
1499 | } | |
1500 | ||
1501 | + public ScheduledFuture<?> visualTask; | |
1502 | + | |
1503 | + public int visualizationTime; | |
1504 | + | |
1505 | + private Skin activeSkin; | |
1506 | + | |
1507 | + private boolean isActiveHat; | |
1508 | + | |
1509 | + private List<Skin> skins; | |
1510 | + | |
1511 | + private int skinId; | |
1512 | + | |
1513 | + public Skin getActiveSkin() | |
1514 | + { | |
1515 | + return this.activeSkin; | |
1516 | + } | |
1517 | + | |
1518 | + public void setActiveSkin(Skin activeSkin) | |
1519 | + { | |
1520 | + this.activeSkin = activeSkin; | |
1521 | + } | |
1522 | + | |
1523 | + public int getSkinId() | |
1524 | + { | |
1525 | + return this.skinId; | |
1526 | + } | |
1527 | + | |
1528 | + public void setSkinId(int skinId) | |
1529 | + { | |
1530 | + this.skinId = skinId; | |
1531 | + } | |
1532 | + | |
1533 | + public boolean isActiveHat() | |
1534 | + { | |
1535 | + return this.isActiveHat; | |
1536 | + } | |
1537 | + | |
1538 | + public void setActiveHat(boolean isActiveHat) | |
1539 | + { | |
1540 | + this.isActiveHat = isActiveHat; | |
1541 | + } | |
1542 | + | |
1543 | + public List<Skin> getSkins() | |
1544 | + { | |
1545 | + return this.skins; | |
1546 | + } | |
1547 | + | |
1548 | + public void setSkins(List<Skin> skins) | |
1549 | + { | |
1550 | + this.skins = skins; | |
1551 | + } | |
1552 | + | |
1553 | + public boolean containsSkin(Skin skin) | |
1554 | + { | |
1555 | + return getSkins().contains(skin); | |
1556 | + } | |
1557 | + | |
1558 | + public boolean loadSkins() | |
1559 | + { | |
1560 | + if (this.skins == null) | |
1561 | + { | |
1562 | + this.skins = new ArrayList<>(); | |
1563 | + } | |
1564 | + Connection con = null; | |
1565 | + PreparedStatement offline = null; | |
1566 | + ResultSet rs = null; | |
1567 | + try | |
1568 | + { | |
1569 | + con = L2DatabaseFactory.getInstance().getConnection(); | |
1570 | + PreparedStatement statement = con.prepareStatement("SELECT skin_id FROM player_skins WHERE char_id=?"); | |
1571 | + statement.setInt(1, getObjectId()); | |
1572 | + ResultSet rset = statement.executeQuery(); | |
1573 | + while (rset.next()) | |
1574 | + { | |
1575 | + this.skins.add(SkinData.getInstance().getSkinById(rset.getInt("skin_id"))); | |
1576 | + } | |
1577 | + con.close(); | |
1578 | + return true; | |
1579 | + } | |
1580 | + catch (Exception e) | |
1581 | + { | |
1582 | + e.printStackTrace(); | |
1583 | + return false; | |
1584 | + } | |
1585 | + finally | |
1586 | + { | |
1587 | + Mysql.closeQuietly(con, offline, rs); | |
1588 | + } | |
1589 | + } | |
1590 | + | |
1591 | + public boolean saveSkins() | |
1592 | + { | |
1593 | + Connection con = null; | |
1594 | + PreparedStatement offline = null; | |
1595 | + ResultSet rs = null; | |
1596 | + | |
1597 | + if (skins == null) | |
1598 | + { | |
1599 | + skins = new ArrayList<>(); | |
1600 | + } | |
1601 | + | |
1602 | + try | |
1603 | + { | |
1604 | + con = L2DatabaseFactory.getInstance().getConnection(); | |
1605 | + PreparedStatement statement = con.prepareStatement("DELETE FROM player_skins WHERE char_id=?"); | |
1606 | + statement.setInt(1, getObjectId()); | |
1607 | + statement.execute(); | |
1608 | + statement = con.prepareStatement("INSERT INTO player_skins (char_id,skin_id) VALUES (?,?)"); | |
1609 | + for (Skin skin : getSkins()) | |
1610 | + { | |
1611 | + statement.setInt(1, getObjectId()); | |
1612 | + statement.setInt(2, skin.getId()); | |
1613 | + statement.execute(); | |
1614 | + } | |
1615 | + con.close(); | |
1616 | + return true; | |
1617 | + } | |
1618 | + catch (Exception e) | |
1619 | + { | |
1620 | + e.printStackTrace(); | |
1621 | + return false; | |
1622 | + } | |
1623 | + finally | |
1624 | + { | |
1625 | + Mysql.closeQuietly(con, offline, rs); | |
1626 | + } | |
1627 | + } | |
1628 | + | |
1629 | public void setFakeArmorObjectId(int objectId) | |
1630 | { | |
1631 | _fakeArmorObjectId = objectId; | |
1632 | diff --git a/src/l2jorion/game/network/clientpackets/RequestBypassToServer.java b/src/l2jorion/game/network/clientpackets/RequestBypassToServer.java | |
1633 | index 7bb0cf1..54d3fd4 100644 | |
1634 | --- a/src/l2jorion/game/network/clientpackets/RequestBypassToServer.java | |
1635 | +++ b/src/l2jorion/game/network/clientpackets/RequestBypassToServer.java | |
1636 | @@ -23,7 +23,10 @@ | |
1637 | import java.sql.ResultSet; | |
1638 | import java.text.NumberFormat; | |
1639 | import java.util.StringTokenizer; | |
1640 | +import java.util.concurrent.ScheduledFuture; | |
1641 | ||
1642 | +import Base.SkinBeauty.Skin; | |
1643 | +import Base.SkinBeauty.SkinData; | |
1644 | import javolution.text.TextBuilder; | |
1645 | import l2jorion.Config; | |
1646 | import l2jorion.game.community.CommunityBoard; | |
1647 | @@ -47,6 +50,7 @@ | |
1648 | import l2jorion.game.model.L2Object; | |
1649 | import l2jorion.game.model.L2Skill; | |
1650 | import l2jorion.game.model.L2World; | |
1651 | +import l2jorion.game.model.actor.instance.L2BeautyShopInstance; | |
1652 | import l2jorion.game.model.actor.instance.L2ClassMasterInstance; | |
1653 | import l2jorion.game.model.actor.instance.L2GrandBossInstance; | |
1654 | import l2jorion.game.model.actor.instance.L2ItemInstance; | |
1655 | @@ -71,6 +75,7 @@ | |
1656 | import l2jorion.game.network.serverpackets.PlaySound; | |
1657 | import l2jorion.game.network.serverpackets.SystemMessage; | |
1658 | import l2jorion.game.templates.L2Item; | |
1659 | +import l2jorion.game.thread.ThreadPoolManager; | |
1660 | import l2jorion.game.util.GMAudit; | |
1661 | import l2jorion.game.util.Util; | |
1662 | import l2jorion.log.Log; | |
1663 | @@ -107,6 +112,9 @@ | |
1664 | return; | |
1665 | } | |
1666 | ||
1667 | + StringTokenizer stSkin = new StringTokenizer(this._command, " "); | |
1668 | + stSkin.nextToken(); | |
1669 | + | |
1670 | try | |
1671 | { | |
1672 | if (_command.startsWith("admin_")) | |
1673 | @@ -572,6 +580,123 @@ | |
1674 | ||
1675 | } | |
1676 | } | |
1677 | + | |
1678 | + else if (this._command.startsWith("skinPage")) | |
1679 | + { | |
1680 | + int page = Integer.parseInt(stSkin.nextToken()); | |
1681 | + showMainWindow(activeChar, page); | |
1682 | + } | |
1683 | + else if (this._command.startsWith("skinHat")) | |
1684 | + { | |
1685 | + if (activeChar.isActiveHat()) | |
1686 | + { | |
1687 | + activeChar.setActiveHat(false); | |
1688 | + } | |
1689 | + } | |
1690 | + else if (this._command.startsWith("acquireSkin")) | |
1691 | + { | |
1692 | + int id = Integer.parseInt(stSkin.nextToken()); | |
1693 | + Skin skin = SkinData.getInstance().getSkinById(id); | |
1694 | + if (skin != null) | |
1695 | + { | |
1696 | + if (activeChar.getSkins().contains(skin)) | |
1697 | + { | |
1698 | + activeChar.sendMessage("Skin " + skin.getName() + " already acquired. Try other!"); | |
1699 | + showSkinWindow(activeChar, skin); | |
1700 | + return; | |
1701 | + } | |
1702 | + if (skin.isVip()) | |
1703 | + { | |
1704 | + if (activeChar.isDonator()) | |
1705 | + { | |
1706 | + if (L2BeautyShopInstance.reduceItem(activeChar, skin.getPriceId(), skin.getPrice()) && activeChar.getSkins().add(skin)) | |
1707 | + { | |
1708 | + activeChar.sendMessage("Skin " + skin.getStats().getString("name") + " acquired!"); | |
1709 | + showSkinWindow(activeChar, skin); | |
1710 | + } | |
1711 | + } | |
1712 | + else | |
1713 | + { | |
1714 | + activeChar.sendMessage("This skin is only for Vip Players!"); | |
1715 | + showSkinWindow(activeChar, skin); | |
1716 | + return; | |
1717 | + } | |
1718 | + } | |
1719 | + else if (L2BeautyShopInstance.reduceItem(activeChar, skin.getPriceId(), skin.getPrice()) && activeChar.getSkins().add(skin)) | |
1720 | + { | |
1721 | + activeChar.sendMessage("Skin " + skin.getName() + " acquired!"); | |
1722 | + showSkinWindow(activeChar, skin); | |
1723 | + } | |
1724 | + } | |
1725 | + } | |
1726 | + else if (this._command.startsWith("trySkin")) | |
1727 | + { | |
1728 | + if (activeChar.visualizationTime > 0) | |
1729 | + { | |
1730 | + activeChar.sendMessage("You already Trying a Skin!"); | |
1731 | + return; | |
1732 | + } | |
1733 | + activeChar.visualizationTime = 5; | |
1734 | + int id = Integer.parseInt(stSkin.nextToken()); | |
1735 | + L2BeautyShopInstance.equipSkin(activeChar, id, true); | |
1736 | + activeChar.visualTask = startCounter(activeChar); | |
1737 | + } | |
1738 | + else if (this._command.startsWith("skinhtm")) | |
1739 | + { | |
1740 | + int id = Integer.parseInt(stSkin.nextToken()); | |
1741 | + Skin skin = SkinData.getInstance().getSkinById(id); | |
1742 | + showSkinWindow(activeChar, skin); | |
1743 | + } | |
1744 | + else if (this._command.startsWith("equipSkin")) | |
1745 | + { | |
1746 | + int id = Integer.parseInt(stSkin.nextToken()); | |
1747 | + L2BeautyShopInstance.equipSkin(activeChar, id, false); | |
1748 | + showSkinWindow(activeChar, SkinData.getInstance().getSkinById(id)); | |
1749 | + } | |
1750 | + else if (this._command.startsWith("unequipSkin")) | |
1751 | + { | |
1752 | + int id = Integer.parseInt(stSkin.nextToken()); | |
1753 | + if (activeChar.isDressMeEnabled()) | |
1754 | + { | |
1755 | + Skin dress = SkinData.getInstance().getSkinById(0); | |
1756 | + activeChar.setActiveHat(false); | |
1757 | + activeChar.setDressMeEnabled(false); | |
1758 | + activeChar.broadcastUserInfo(); | |
1759 | + activeChar.setSkinId(0); | |
1760 | + activeChar.setActiveSkin(dress); | |
1761 | + activeChar.sendMessage("Skin unequiped!"); | |
1762 | + showSkinWindow(activeChar, SkinData.getInstance().getSkinById(id)); | |
1763 | + } | |
1764 | + else | |
1765 | + { | |
1766 | + activeChar.sendMessage("You don't have any skin equiped!"); | |
1767 | + showMainWindow(activeChar, 0); | |
1768 | + return; | |
1769 | + } | |
1770 | + } | |
1771 | + else if (this._command.startsWith("activeHat")) | |
1772 | + { | |
1773 | + if (!activeChar.isDressMeEnabled()) | |
1774 | + { | |
1775 | + activeChar.sendMessage("You don't have any skin equiped! First Equip a Skin!"); | |
1776 | + showMainWindow(activeChar, 0); | |
1777 | + return; | |
1778 | + } | |
1779 | + if (activeChar.isActiveHat()) | |
1780 | + { | |
1781 | + activeChar.setActiveHat(false); | |
1782 | + activeChar.setDressMeEnabled(true); | |
1783 | + activeChar.broadcastUserInfo(); | |
1784 | + } | |
1785 | + else | |
1786 | + { | |
1787 | + activeChar.setActiveHat(true); | |
1788 | + activeChar.setDressMeEnabled(true); | |
1789 | + activeChar.broadcastUserInfo(); | |
1790 | + } | |
1791 | + showMainWindow(activeChar, 0); | |
1792 | + } | |
1793 | + | |
1794 | // Draw a Symbol | |
1795 | else if (_command.equals("Draw")) | |
1796 | { | |
1797 | @@ -1278,6 +1403,83 @@ | |
1798 | sendEditWindow(p, part); | |
1799 | } | |
1800 | ||
1801 | + public static void showSkinWindow(L2PcInstance player, Skin skin) | |
1802 | + { | |
1803 | + String filename = "data/html/SkinManager/Skin.htm"; | |
1804 | + NpcHtmlMessage html = new NpcHtmlMessage(0); | |
1805 | + html.setFile(filename); | |
1806 | + html.replace("%hat%", player.isActiveHat() ? "<font color=\"00ff00\">ON</font>" : "<font color=\"ff0000\">OFF</font>"); | |
1807 | + html.replace("%showbutton%", L2BeautyShopInstance.showButtons(player, skin)); | |
1808 | + html.replace("%skinprice%", skin.getPrice()); | |
1809 | + html.replace("%skinpriceid%", skin.getPriceItemName()); | |
1810 | + html.replace("%skiname%", skin.getName()); | |
1811 | + html.replace("%icon%", "<img src=\"MAYKE_MENDES_SKIN" + L2BeautyShopInstance.getIconPath(player, skin) + "\" width=32 height=32/>"); | |
1812 | + html.replace("%skinstatus%", player.containsSkin(skin) ? "<font color=\"LEVEL\">Already Acquired</font>" : "Not Acquired"); | |
1813 | + html.replace("%skinvip%", skin.isVip() ? "<font color=\"00ff00\">TRUE</font>" : "<font color=\"ff0000\">FALSE</font>"); | |
1814 | + player.sendPacket(html); | |
1815 | + } | |
1816 | + | |
1817 | + public void showMainWindow(L2PcInstance player, int page) | |
1818 | + { | |
1819 | + String filename = "data/html/SkinManager/Main.htm"; | |
1820 | + NpcHtmlMessage html = new NpcHtmlMessage(0); | |
1821 | + html.setFile(filename); | |
1822 | + html.replace("%hat%", player.isActiveHat() ? "ON" : "OFF"); | |
1823 | + html.replace("%skins%", L2BeautyShopInstance.generateSkinsHtml(player, page)); | |
1824 | + html.replace("%pages%", L2BeautyShopInstance.generatePagesHtml(player)); | |
1825 | + player.sendPacket(html); | |
1826 | + filename = null; | |
1827 | + html = null; | |
1828 | + } | |
1829 | + | |
1830 | + class Counter implements Runnable | |
1831 | + { | |
1832 | + L2PcInstance p; | |
1833 | + | |
1834 | + int id; | |
1835 | + | |
1836 | + Counter(L2PcInstance p) | |
1837 | + { | |
1838 | + this.p = p; | |
1839 | + } | |
1840 | + | |
1841 | + @Override | |
1842 | + public void run() | |
1843 | + { | |
1844 | + if (this.p.visualizationTime >= 0) | |
1845 | + { | |
1846 | + this.p.sendPacket(new ExShowScreenMessage("Current skin visualization will end in: " + this.p.visualizationTime, 1100)); | |
1847 | + } | |
1848 | + else | |
1849 | + { | |
1850 | + if (p.getSkinId() == 0) | |
1851 | + { | |
1852 | + Skin dress = SkinData.getInstance().getSkinById(id); | |
1853 | + p.setActiveSkin(dress); | |
1854 | + } | |
1855 | + this.p.setSkinId(0); | |
1856 | + Skin dress = SkinData.getInstance().getSkinById(0); | |
1857 | + p.setActiveSkin(dress); | |
1858 | + this.p.setDressMeEnabled(false); | |
1859 | + this.p.broadcastUserInfo(); | |
1860 | + this.p.sendPacket(new ExShowScreenMessage("Current skin visualization time it's over!", 2000)); | |
1861 | + RequestBypassToServer.stopCounter(this.p.visualTask); | |
1862 | + } | |
1863 | + this.p.visualizationTime--; | |
1864 | + } | |
1865 | + } | |
1866 | + | |
1867 | + public static void stopCounter(ScheduledFuture<?> task) | |
1868 | + { | |
1869 | + task.cancel(true); | |
1870 | + task = null; | |
1871 | + } | |
1872 | + | |
1873 | + public ScheduledFuture<?> startCounter(L2PcInstance player) | |
1874 | + { | |
1875 | + return ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new Counter(player), 1000L, 1000L); | |
1876 | + } | |
1877 | + | |
1878 | public void sendEditWindow(L2PcInstance p, String part) | |
1879 | { | |
1880 | NpcHtmlMessage htm = new NpcHtmlMessage(0); | |
1881 | diff --git a/src/l2jorion/game/network/serverpackets/CharInfo.java b/src/l2jorion/game/network/serverpackets/CharInfo.java | |
1882 | index a8bf3be..c7eda05 100644 | |
1883 | --- a/src/l2jorion/game/network/serverpackets/CharInfo.java | |
1884 | +++ b/src/l2jorion/game/network/serverpackets/CharInfo.java | |
1885 | @@ -23,6 +23,7 @@ | |
1886 | import java.util.Map; | |
1887 | import java.util.Set; | |
1888 | ||
1889 | +import Base.SkinBeauty.Skin; | |
1890 | import l2jorion.Config; | |
1891 | import l2jorion.game.datatables.sql.NpcTable; | |
1892 | import l2jorion.game.managers.CursedWeaponsManager; | |
1893 | @@ -182,18 +183,38 @@ | |
1894 | writeD(_activeChar.getBaseClass()); | |
1895 | } | |
1896 | ||
1897 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR)); | |
1898 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD)); | |
1899 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1900 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND)); | |
1901 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES)); | |
1902 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST)); | |
1903 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS)); | |
1904 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET)); | |
1905 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK)); | |
1906 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1907 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR)); | |
1908 | - writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE)); | |
1909 | + final Skin dress = _activeChar.getActiveSkin(); | |
1910 | + | |
1911 | + if (!_activeChar.isDressMeEnabled()) | |
1912 | + { | |
1913 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR)); | |
1914 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD)); | |
1915 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1916 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND)); | |
1917 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES)); | |
1918 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST)); | |
1919 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS)); | |
1920 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET)); | |
1921 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK)); | |
1922 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1923 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR)); | |
1924 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE)); | |
1925 | + } | |
1926 | + else | |
1927 | + { | |
1928 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR)); | |
1929 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD)); | |
1930 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1931 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND)); | |
1932 | + writeD(dress != null ? dress.getGloves() : _inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES)); | |
1933 | + writeD(dress != null ? dress.getChest() : _inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST)); | |
1934 | + writeD(dress != null ? dress.getLegs() : _inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS)); | |
1935 | + writeD(dress != null ? dress.getFeet() : _inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET)); | |
1936 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK)); | |
1937 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1938 | + writeD(dress != null ? dress.getHair() : _inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR)); | |
1939 | + writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE)); | |
1940 | + } | |
1941 | ||
1942 | // c6 new h's | |
1943 | writeH(0x00); | |
1944 | diff --git a/src/l2jorion/game/network/serverpackets/UserInfo.java b/src/l2jorion/game/network/serverpackets/UserInfo.java | |
1945 | index 7ec8b56..a04983d 100644 | |
1946 | --- a/src/l2jorion/game/network/serverpackets/UserInfo.java | |
1947 | +++ b/src/l2jorion/game/network/serverpackets/UserInfo.java | |
1948 | @@ -20,6 +20,7 @@ | |
1949 | */ | |
1950 | package l2jorion.game.network.serverpackets; | |
1951 | ||
1952 | +import Base.SkinBeauty.Skin; | |
1953 | import l2jorion.Config; | |
1954 | import l2jorion.game.datatables.sql.NpcTable; | |
1955 | import l2jorion.game.managers.CursedWeaponsManager; | |
1956 | @@ -114,42 +115,84 @@ | |
1957 | writeD(_activeChar.getMaxLoad()); | |
1958 | ||
1959 | writeD(_activeChar.getActiveWeaponItem() != null ? 40 : 20); // 20 no weapon, 40 weapon equippe | |
1960 | + final Skin dress = _activeChar.getActiveSkin(); | |
1961 | ||
1962 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_DHAIR)); | |
1963 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR)); | |
1964 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR)); | |
1965 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK)); | |
1966 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER)); | |
1967 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER)); | |
1968 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD)); | |
1969 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); | |
1970 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND)); | |
1971 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES)); | |
1972 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST)); | |
1973 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS)); | |
1974 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET)); | |
1975 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK)); | |
1976 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); | |
1977 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR)); | |
1978 | - writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FACE)); | |
1979 | - | |
1980 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DHAIR)); | |
1981 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR)); | |
1982 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR)); | |
1983 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK)); | |
1984 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER)); | |
1985 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER)); | |
1986 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD)); | |
1987 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1988 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND)); | |
1989 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES)); | |
1990 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST)); | |
1991 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS)); | |
1992 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET)); | |
1993 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK)); | |
1994 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
1995 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR)); | |
1996 | - writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FACE)); | |
1997 | + if (!_activeChar.isDressMeEnabled()) | |
1998 | + { | |
1999 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_DHAIR)); | |
2000 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR)); | |
2001 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR)); | |
2002 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK)); | |
2003 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER)); | |
2004 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER)); | |
2005 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD)); | |
2006 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); | |
2007 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND)); | |
2008 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES)); | |
2009 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST)); | |
2010 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS)); | |
2011 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET)); | |
2012 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK)); | |
2013 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); | |
2014 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR)); | |
2015 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FACE)); | |
2016 | + | |
2017 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DHAIR)); | |
2018 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR)); | |
2019 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR)); | |
2020 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK)); | |
2021 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER)); | |
2022 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER)); | |
2023 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD)); | |
2024 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
2025 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND)); | |
2026 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES)); | |
2027 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST)); | |
2028 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS)); | |
2029 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET)); | |
2030 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK)); | |
2031 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
2032 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR)); | |
2033 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FACE)); | |
2034 | + } | |
2035 | + else | |
2036 | + { | |
2037 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_DHAIR)); | |
2038 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR)); | |
2039 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR)); | |
2040 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK)); | |
2041 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER)); | |
2042 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER)); | |
2043 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD)); | |
2044 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); | |
2045 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND)); | |
2046 | + writeD(dress != null ? dress.getGloves() : _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES)); | |
2047 | + writeD(dress != null ? dress.getChest() : _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST)); | |
2048 | + writeD(dress != null ? dress.getLegs() : _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS)); | |
2049 | + writeD(dress != null ? dress.getFeet() : _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET)); | |
2050 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK)); | |
2051 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); | |
2052 | + writeD(dress != null ? dress.getHair() : _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR)); | |
2053 | + writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FACE)); | |
2054 | + | |
2055 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DHAIR)); | |
2056 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR)); | |
2057 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR)); | |
2058 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK)); | |
2059 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER)); | |
2060 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER)); | |
2061 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD)); | |
2062 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
2063 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND)); | |
2064 | + writeD(dress != null ? dress.getGloves() : _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES)); | |
2065 | + writeD(dress != null ? dress.getChest() : _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST)); | |
2066 | + writeD(dress != null ? dress.getLegs() : _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS)); | |
2067 | + writeD(dress != null ? dress.getFeet() : _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET)); | |
2068 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK)); | |
2069 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)); | |
2070 | + writeD(dress != null ? dress.getHair() : _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR)); | |
2071 | + writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FACE)); | |
2072 | + } | |
2073 | ||
2074 | writeH(0x00); | |
2075 | writeH(0x00); | |
2076 |