View difference between Paste ID: YNu4tf5a and FLWYv5jN
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